ngx_test_full_name
声明在 src\core\ngx_file.c
static ngx_int_t ngx_test_full_name(ngx_str_t *name);
定义在 src\core\ngx_file.c
static ngx_int_t ngx_test_full_name(ngx_str_t *name) { #if (NGX_WIN32)u_char c0, c1;c0 = name->data[0];if (name->len < 2) {if (c0 == '/') {return 2;}return NGX_DECLINED;}c1 = name->data[1];if (c1 == ':') {c0 |= 0x20;if ((c0 >= 'a' && c0 <= 'z')) {return NGX_OK;}return NGX_DECLINED;}if (c1 == '/') {return NGX_OK;}if (c0 == '/') {return 2;}return NGX_DECLINED;#elseif (name->data[0] == '/') {return NGX_OK;}return NGX_DECLINED;#endif }
ngx_test_full_name
是一个用于判断路径名是否为“完整路径”的函数
函数签名
static ngx_int_t ngx_test_full_name(ngx_str_t *name)
ngx_int_t
:Nginx 自定义的整数类型,通常用于返回状态码。ngx_str_t
:Nginx 自定义的字符串结构体,包含两个字段:
data
:指向字符串数据的指针。len
:字符串的长度。static
:表明该函数的作用域仅限于当前文件,不会被其他文件调用。- name:传入的需要判断的路径
Windows 平台的特殊处理
#if (NGX_WIN32)
条件编译 :
NGX_WIN32
是一个宏,表示当前代码运行在 Windows 平台上。Windows 和类 Unix 系统(如 Linux)对路径的处理方式不同,因此需要分别处理
变量声明
u_char c0, c1;
u_char
:无符号字符类型,等价于unsigned char
。c0
和c1
:分别用于存储路径字符串的第一个和第二个字符。
检查路径长度
c0 = name->data[0]; if (name->len < 2) {if (c0 == '/') {return 2;}return NGX_DECLINED; }
c0 = name->data[0]
:获取路径字符串的第一个字符。if (name->len < 2)
:如果路径长度小于 2,则进行以下判断:
- 如果第一个字符是
/
,返回2
,表示路径是一个根路径(例如/
或/abc
),需要添加盘符 (如/
→C:/
)- 否则,返回
NGX_DECLINED
,表示路径不符合要求。在路径长度不足的情况下,快速判断是否为根路径。
提取次字符并检测盘符路径
c1 = name->data[1]; if (c1 == ':') {c0 |= 0x20;if ((c0 >= 'a' && c0 <= 'z')) {return NGX_OK;}return NGX_DECLINED; }
c1 == ':'
: 检测Windows盘符格式(如C:
)。
c0 |= 0x20
: 通过位操作将大写字母转为小写(A
(0x41) →a
(0x61))。原理:
0x20
是ASCII表中大小写字母的差值,按位或操作实现不区分大小写。范围检查: 确保盘符在
a-z
之间,兼容C:/
和c:/
写法。拒绝非法盘符: 如
0:
或G:
(超出a-z
范围)。
检查 UNC 路径
if (c1 == '/') {return NGX_OK; }
if (c1 == '/')
:如果第二个字符是斜杠/
,则可能是 UNC 路径(例如//server/share
)。- 返回
NGX_OK
,表示路径有效。
UNC(Universal Naming Convention,通用命名约定)路径 是一种用于在计算机网络中标识共享资源(如文件夹、打印机等)的路径格式。它主要用于 Windows 操作系统,允许用户通过网络访问远程计算机上的资源,而无需映射网络驱动器
UNC 路径的基本格式如下:
\\<ServerName>\<SharedResource>
\\
:UNC 路径以两个反斜杠开头,表示这是一个网络路径。<ServerName>
:这是提供共享资源的服务器名称或 IP 地址。例如:
FileServer
192.168.1.100
<SharedResource>
:这是服务器上共享的具体资源名称,例如文件夹或打印机。例如:
SharedFolder
Printer1
完整的 UNC 路径示例:
\\FileServer\SharedFolder
\\192.168.1.100\Documents
检查根路径
if (c0 == '/') {return 2; }
首字符为'/'
可能为根目录(如"/path"需转换为"C:/path")
return NGX_DECLINED;
- 如果以上条件都不满足,则返回
NGX_DECLINED
,表示路径无效。
非 Windows 平台的处理
#else if (name->data[0] == '/') {return NGX_OK; } return NGX_DECLINED; #endif
- 在非 Windows 平台上,路径的有效性判断较为简单:
- 如果路径的第一个字符是
/
,则返回NGX_OK
,表示路径有效。- 否则,返回
NGX_DECLINED
。类 Unix 系统(如 Linux)的路径规范较为统一,只需检查是否以
/
开头即可