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

Nginx+PHP站点配置问题:屏蔽.php后缀访问并保留干净URL

解决Nginx屏蔽.php直接访问并支持干净URL的配置方案

问题根源

原配置里两个匹配.php的location规则冲突:外部访问.php会被拦截返回404,但try_files内部跳转至.php文件时也会被同一条规则拦截,导致干净URL无法加载对应PHP文件,甚至出现循环问题。

修正后的完整配置

server {
    root /var/www/html/example;
    index index.php index.html;

    server_name example.com www.example.com;

    # 处理干净URL:请求路径不存在时,自动追加.php后缀
    location / {
        try_files $uri $uri/ /$uri.php?$args;
    }

    # 拦截外部直接访问的.php URL,允许内部跳转加载PHP文件
    location ~ \.php$ {
        # 仅对外部直接请求返回404,内部跳转请求正常处理
        if ($is_internal != 1) {
            return 404;
        }

        # 正常处理PHP文件(内部跳转过来的请求)
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    listen [::]:443 ssl ipv6only=on;
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}

关键说明

  • $is_internal变量:Nginx内置变量,值为1代表当前是内部跳转请求(比如try_files触发的跳转),为空则是外部用户直接发起的请求。通过这个变量精准区分两种场景,只拦截外部手动访问.php的请求。
  • try_files规则:优先访问请求路径对应的文件/目录,不存在时自动追加.php后缀并内部跳转,保证干净URL能正确加载对应PHP文件。
  • 移除冲突规则:删掉原配置中单独返回404的.php location,避免拦截内部跳转请求。

验证步骤

  1. 访问https://example.com/login.php,应返回404错误。
  2. 访问https://example.com/login,应正常加载login.php内容。
  3. 重启Nginx使配置生效:sudo systemctl restart nginx

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:10:07