Nginx访问真实目录路径时如何正确获取REQUEST_URI值
当前配置中try_files $uri $uri/ /index.php?$query_string;规则按从左到右的优先级执行:
- 首先检查请求路径是否对应服务器上存在的文件,存在则直接返回文件
- 其次检查请求路径是否对应服务器上存在的目录(即
$uri/项的作用),匹配到目录时Nginx会直接在目录内查找index指令定义的默认首页:目录下有首页文件则直接返回首页,无首页时开了autoindex on就展示目录列表,关了autoindex就返回403错误 - 前两项都匹配失败时,才会把请求转发到
index.php入口文件
访问真实存在的目录时,规则在第二步就被拦截,根本不会执行到转发到入口文件的逻辑,因此PHP代码无法拿到对应路径的REQUEST_URI值。
你只需要调整两处配置文件中location /块下的try_files规则,删除规则中的$uri/项即可,修改后Nginx将不再主动匹配真实存在的目录,所有非实体文件的请求(包括目录请求、不存在的路径请求)都会统一转发到index.php入口。
1. 修改C:/nginx路径下的nginx.conf
找到对应server块内的location /配置,修改为:
location / { # 删掉了原规则中的$uri/项 try_files $uri /index.php?$query_string; }
其余配置(PHP解析、根目录、域名等)保持不变即可。
2. 修改OpenServer目录下的nginx.conf
找到对应server块内的location /配置,修改为:
location / { # 删掉了原规则中的$uri/项 try_files $uri /index.php?$query_string; location ~ \.php$ { try_files $fastcgi_script_name =404; fastcgi_pass backend; include '%sprogdir%/userdata/config/nginx_fastcgi_params.txt'; } }
其余配置保持不变。
- 独立Nginx环境执行命令
nginx -s reload重载配置即可生效 - OpenServer环境直接在面板重启Nginx服务即可生效
修改完成后访问mysite/folder1、mysite/folder2这类真实目录路径时,请求会被正确转发到index.php,$_SERVER['REQUEST_URI']可以完整获取到原始请求路径,不会再出现目录列表或403错误。同时真实存在的静态资源(css、js、图片、实体PHP文件等)仍可正常直接访问,不影响原有静态资源加载逻辑。
如果你不需要让实体静态文件被直接访问,想要所有请求100%走index.php,可把try_files规则直接简化为
try_files /index.php?$query_string;即可。注意:修改后访问不带末尾斜杠的真实目录路径时,Nginx默认会返回301重定向补全末尾斜杠,该行为属于Nginx默认目录规范逻辑,不影响REQUEST_URI获取,如无特殊需求无需额外调整。
内容的提问来源于stack exchange,提问作者Константин Сурков

