You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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等)
    }
}

配置解释

  1. 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)
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:55:05