NGINX配置:将请求路径传至PHP变量,排除真实文件路径
解决NGINX转发路径到index.php并排除真实文件的问题
我来帮你搞定这个配置问题!你的需求是把所有非真实文件的请求转发到index.php?page=路径,同时让真实存在的文件(比如/file.jpg、/images/favicon.ico)直接被NGINX处理,避免出现无匹配路径的错误。下面是最可靠的实现方案:
核心思路:优先处理真实文件,再转发动态请求
NGINX的try_files指令正好能满足这个需求——它会按顺序尝试访问指定的资源,只有当所有尝试都失败时,才会跳转到最后的 fallback 地址。这样就不用写复杂的正则排除,既简洁又不易出错。
完整配置示例
server { listen 80; server_name domain.com; root /var/www/html; # 替换成你的网站根目录 # 处理所有请求:先尝试真实文件/目录,再转发到index.php location / { try_files $uri $uri/ /index.php?page=$uri; } # 处理PHP请求的配置 location ~ \.php$ { fastcgi_pass php:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; # 引入默认的FastCGI参数(包含QUERY_STRING等) } }
配置解释
try_files $uri $uri/ /index.php?page=$uri$uri:尝试访问请求的路径对应的真实文件(比如/file.jpg),如果文件存在,直接返回给客户端$uri/:如果请求的是目录(比如/images/),尝试访问该目录(通常会返回目录索引或403,取决于你的配置)/index.php?page=$uri:当前面的尝试都失败时,把请求转发到index.php,并将请求路径作为page参数传递(比如/a/b/c会变成index.php?page=/a/b/c)
PHP处理部分
- 这里没有直接修改
QUERY_STRING,而是通过include fastcgi_params保留了默认的参数设置,同时正确设置了SCRIPT_FILENAME让PHP-FPM能找到index.php文件。你可以在PHP里通过$_GET['page']获取到传递的路径。
- 这里没有直接修改
额外优化:如果需要去掉路径开头的斜杠
如果你的业务逻辑需要page参数不带开头的/(比如希望/a/b/c对应page=a/b/c),可以修改try_files的最后一部分:
try_files $uri $uri/ /index.php?page=$request_uri;
然后在PHP里处理:
$page = ltrim($_GET['page'], '/');
避免你原来配置的问题
你之前的配置直接覆盖QUERY_STRING会导致丢失其他可能的查询参数(比如如果用户请求/a/b/c?foo=bar,你的配置会把QUERY_STRING改成/index.php?page=a/b/c,丢失foo=bar)。而上面的方案会保留原查询参数,比如/a/b/c?foo=bar会被转发成index.php?page=/a/b/c&foo=bar,更符合预期。
内容的提问来源于stack exchange,提问作者user6791424
相关产品推荐
相关产品推荐

