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的
.phplocation,避免拦截内部跳转请求。
验证步骤
- 访问
https://example.com/login.php,应返回404错误。 - 访问
https://example.com/login,应正常加载login.php内容。 - 重启Nginx使配置生效:
sudo systemctl restart nginx
内容的提问来源于stack exchange,提问作者Berkay Y
相关产品推荐
相关产品推荐

