nginx部署thinkphp出现404或无法隐藏index.php,需配置rewrite规则:一、if+rewrite方式(兼容性强,宝塔推荐);二、try_files方式(更规范,需path_info支持);三、子目录部署专用规则;四、禁用敏感路径访问以加固安全。

如果您在Nginx环境下部署ThinkPHP应用,访问URL时出现404错误或无法隐藏index.php,则很可能是由于Rewrite规则缺失或配置不当,导致路由请求未正确转发至入口文件。以下是解决此问题的步骤:
一、使用if+rewrite方式(兼容性最强,推荐宝塔环境)
该方法通过判断请求文件是否存在,将非静态资源请求重写至index.php并携带查询参数,适用于大多数Nginx版本及宝塔面板,默认无需启用pathinfo支持,适配ThinkPHP 6的REWRITE模式(URL_MODEL=2)。
1、进入宝塔面板 → 网站 → 对应站点 → 配置文件。
2、在server块内、location ~ \.php$规则之前插入以下配置段:
location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; break; } }
3、保存配置后,点击“重载配置”使生效。
4、登录ThinkPHP项目,确认config/app.php中'url_model' => 2已启用REWRITE模式。
二、使用try_files方式(更规范,需配合PATH_INFO解析)
该方式避免使用被Nginx官方标记为不推荐的if指令,利用try_files天然的fallback机制,配合fastcgi_split_path_info提取PATH_INFO,确保路由参数完整传递,适用于自建Nginx且版本≥1.10的场景。
1、在server块中替换或新增location /配置:
location / { try_files $uri $uri/ /index.php?$query_string; }
2、确保location ~ \.php($|/)块存在,并包含以下关键行:
location ~ \.php($|/) { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info; include fastcgi_params; }
3、检查PHP-FPM配置中未禁用security.limit_extensions对.php以外扩展的拦截。
4、重启nginx与php-fpm服务。
三、子目录部署专用规则(支持如http://example.com/myapp/路径)
当ThinkPHP项目未部署在网站根目录,而是在子目录(如/myapp/)下运行时,必须显式适配URI前缀,否则重写后路径错位将导致404或无限循环。该规则通过正则捕获子目录名并透传至s参数,保持路由语义一致。
1、确定子目录路径,例如项目访问地址为https://example.com/myapp/,则子目录标识为/myapp/。
2、在server块中添加如下location配置(注意替换/myapp为实际路径):
location /myapp/ { if (!-e $request_filename) { rewrite ^/myapp/(.*)$ /myapp/index.php?s=/$1 last; break; } }
3、设置root指向网站根目录(如/www/wwwroot/example.com),确保/myapp/index.php物理路径可访问。
4、在ThinkPHP配置中设置'app_host' => 'example.com/myapp'或通过APP_SUB_DOMAIN_DEPLOY启用子域名部署逻辑(如适用)。
四、禁用敏感路径访问(安全加固必选项)
未经防护的ThinkPHP目录结构可能暴露app、config、.env等关键路径,造成源码泄露或配置信息外泄。此步骤不参与路由重写,但必须与Rewrite规则共存于同一server块,否则安全隐患将覆盖功能优化成果。
1、在server块末尾添加以下禁止访问规则:
location ~ ^/(app|config|database|runtime|vendor|extend)/ { deny all; }
location ~ /\.(env|git|htaccess|svn|log|sh|bash|ini|lock|xml|yml|yaml|json)$ { deny all; }
2、确认上述正则未被其他location块覆盖,尤其避免置于location /之后却未加^~前缀导致优先级失效。
3、执行nginx -t验证语法,无误后重载服务。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











