除index.php外访问其他PHP文件时如何返回404状态码?
问题原因
Nginx 的正则 location 匹配优先级高于普通前缀 location,且正则匹配按配置书写顺序优先命中先出现的规则。你当前的配置存在两个问题:
- 原有 PHP 匹配规则
location ~ /*.php写法不严谨,正则逻辑不符合预期,会命中所有包含.php后缀的请求,包括index.php - 没有对
index.php做单独的放通配置,导致路由转发到index.php时也被返回 404
解决方案
调整配置顺序,优先匹配并放通 index.php,其余 PHP 文件全部返回 404 即可,完整配置示例如下:
# 原有路由规则保持不变,将所有不存在的资源请求转发到 index.php location / { try_files $uri $uri/ /index.php?$args; } # 单独匹配 index.php,填写你原有正常的 PHP 解析配置即可 location ~ ^/index\.php$ { # 此处替换为你原有 PHP 处理逻辑,示例(根据实际环境修改): # fastcgi_pass unix:/run/php/php8.2-fpm.sock; # fastcgi_index index.php; # include fastcgi_params; # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } # 匹配所有其他 .php 结尾的请求,直接返回 404 location ~ \.php$ { return 404; }
验证逻辑
- 直接访问
yoursite.com/other.php会命中最后一条正则规则,返回 404 - 访问任意自定义路由会被
location /转发到index.php,命中单独放通的index.php规则,正常执行解析
内容的提问来源于stack exchange,提问作者Anthony Frizalone
相关产品推荐
相关产品推荐

