You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Nginx中如何将所有PHP请求重写到指定URL且保留客户端URL?

在Nginx中实现所有PHP请求的内部重写

没问题,我来帮你搞定这个Nginx重写需求,还有你关心的PHP变量问题~

核心配置方案

要实现所有PHP请求(不管是根目录的thing.php,还是子目录里的index.php)都内部重写到指定URL,同时保持客户端显示的URL不变,关键是用Nginx的内部重写规则,还要避免循环重写的坑。

推荐用下面的配置结构,放在你的server块里:

server {
    listen 443 ssl;
    server_name somesite.com;

    # 配置你的网站根目录,根据实际路径修改
    root /var/www/somesite;
    index index.php;

    # 先精确匹配目标文件的请求,直接转发给PHP-FPM,避免循环
    location = /dir/someotherthing.php {
        fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 换成你的PHP-FPM套接字或端口,比如127.0.0.1:9000
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # 匹配所有其他以.php结尾的请求,内部重写到目标URL
    location ~ \.php$ {
        rewrite ^ /dir/someotherthing.php last;
    }

    # 其他必要配置,比如SSL证书、静态文件处理等...
    ssl_certificate /path/to/your/cert.pem;
    ssl_certificate_key /path/to/your/key.pem;
}

配置说明

  • 精确匹配的location = /dir/someotherthing.php优先级最高,当重写后的请求过来时,会直接进入这个规则处理,不会再次触发重写,完美避免循环问题。
  • rewrite ^ /dir/someotherthing.php last;中的last参数会让Nginx重新匹配location规则,这样重写后的请求就能命中上面的精确匹配规则,完成内部转发,客户端完全看不到目标URL。
  • 对于https://somesite.com/dir/这类请求,因为Nginx默认会把目录请求指向index.php,所以会自动触发上面的PHP请求匹配规则,最终重写到目标文件。

关于PHP $_SERVER['REQUEST_URI']的说明

你关心的这个变量,默认情况下会保留客户端原始请求的URI,不会变成重写后的目标URL。

原因是Nginx的fastcgi_params配置文件里默认有一行:

fastcgi_param REQUEST_URI $request_uri;

这里的$request_uri变量存储的是客户端最初发送的完整请求路径(包括查询参数),比如用户访问https://somesite.com/thing.php?id=123,PHP里的$_SERVER['REQUEST_URI']就会是"/thing.php?id=123",而不是重写后的"/dir/someotherthing.php"

如果特殊场景下你需要获取重写后的URI,可以修改这个参数为:

fastcgi_param REQUEST_URI $uri$is_args$args;

这样$_SERVER['REQUEST_URI']就会变成重写后的路径加查询参数,但绝大多数情况下,保留原始请求的URI更符合业务需求(比如日志记录、路由逻辑处理等)。

内容的提问来源于stack exchange,提问作者POPCORNS

火山引擎 最新活动