如何配置ThinkPHP伪静态规则?
- 内容介绍
- 文章标签
- 相关推荐
本文共计989个文字,预计阅读时间需要4分钟。
ThinkPHP+伪静态配置,但需服务器重写规则,框架路由生效,缺一不可。单独改config/app.php或仅加.htaccess都会导致404错误。
Apache 下 .htaccess 规则怎么写才不丢参数
常见错误是直接复制网上残缺规则,导致 GET 参数丢失或 PATH_INFO 解析失败。
-
RewriteCond %{REQUEST_FILENAME} !-d和RewriteCond %{REQUEST_FILENAME} !-f必须都有,否则真实存在的静态资源(如/static/css/app.css)会被错误转发到index.php -
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]中的QSA(Query String Append)不能省,否则带?from=wechat这类参数的请求会丢掉 - 如果项目不在网站根目录(比如部署在
/myapp/),必须加RewriteBase /myapp/,否则重写路径错位 -
AllowOverride FileInfo Options要在 Apache 虚拟主机配置里显式开启,仅靠.htaccess文件存在没用
Nginx 的 try_files 方式比 if 更可靠
用 if (!-e $request_filename) 在 Nginx 里属于“陷阱语法”,容易因条件判断顺序出错,推荐无条件使用 try_files。
- 正确写法:
try_files $uri $uri/ /index.php?s=$uri&$args;—— 注意&是 HTML 实体,配置文件里要写成&,否则 Nginx 启动失败 - 不要用
rewrite ^/(.*)$ /index.php/$1 last;这种写法,TP6 默认用s=参数传路径,不是PATH_INFO模式 - 确保
location ~ \.php$块里有fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,否则$_SERVER['SCRIPT_NAME']可能为空 - 宝塔面板选“ThinkPHP”伪静态模板时,它默认用的是
if写法,上线前建议手动改成try_files
config/app.php 里这几个开关必须对得上
框架层不配合,服务器再正确也白搭。TP6 和 TP5.x 的关键配置项位置和默认值不同,容易混淆。
立即学习“PHP免费学习笔记(深入)”;
-
'url_route_on' => true是基础,但 TP6 默认已开,TP5.x 需手动取消注释 -
'pathinfo_depr' => '/'必须和重写规则里的分隔符一致;如果 Nginx 规则用s=$1,这里就不能设成'-' -
'url_html_suffix' => ''(空字符串)最安全,设成'html'会导致所有 URL 强制加.html,和通用伪静态冲突 - TP6 不再读
config.php里的旧配置项,别去改url_route_must这类 TP5.x 才用的键
调试时怎么看是不是真生效了
别只看地址栏有没有 index.php,那只是表象。真正要看的是请求是否进到了框架路由层。
- 在控制器方法开头加
dump(request()->url()); die;,访问/user/profile,输出应为完整路径(如/user/profile),而不是/index.php/user/profile - 查看 Nginx error log 或 Apache error log,出现
rewrite or internal redirection cycle说明重写规则形成死循环 - 用
curl -I http://your.site/test-route看响应头,状态码是 200 且没有Location:跳转,才算真正命中伪静态 - 如果首页能访问、子页面 404,大概率是
public目录没设为网站根目录,Nginx/Apache 指向了项目根而非public
最容易被忽略的是:ThinkPHP 的伪静态本质是“把所有非真实文件请求都交给 index.php 处理”,所以 public 必须是 Web 服务器的实际 DocumentRoot,任何一层路径错位都会让重写规则失效。
本文共计989个文字,预计阅读时间需要4分钟。
ThinkPHP+伪静态配置,但需服务器重写规则,框架路由生效,缺一不可。单独改config/app.php或仅加.htaccess都会导致404错误。
Apache 下 .htaccess 规则怎么写才不丢参数
常见错误是直接复制网上残缺规则,导致 GET 参数丢失或 PATH_INFO 解析失败。
-
RewriteCond %{REQUEST_FILENAME} !-d和RewriteCond %{REQUEST_FILENAME} !-f必须都有,否则真实存在的静态资源(如/static/css/app.css)会被错误转发到index.php -
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]中的QSA(Query String Append)不能省,否则带?from=wechat这类参数的请求会丢掉 - 如果项目不在网站根目录(比如部署在
/myapp/),必须加RewriteBase /myapp/,否则重写路径错位 -
AllowOverride FileInfo Options要在 Apache 虚拟主机配置里显式开启,仅靠.htaccess文件存在没用
Nginx 的 try_files 方式比 if 更可靠
用 if (!-e $request_filename) 在 Nginx 里属于“陷阱语法”,容易因条件判断顺序出错,推荐无条件使用 try_files。
- 正确写法:
try_files $uri $uri/ /index.php?s=$uri&$args;—— 注意&是 HTML 实体,配置文件里要写成&,否则 Nginx 启动失败 - 不要用
rewrite ^/(.*)$ /index.php/$1 last;这种写法,TP6 默认用s=参数传路径,不是PATH_INFO模式 - 确保
location ~ \.php$块里有fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,否则$_SERVER['SCRIPT_NAME']可能为空 - 宝塔面板选“ThinkPHP”伪静态模板时,它默认用的是
if写法,上线前建议手动改成try_files
config/app.php 里这几个开关必须对得上
框架层不配合,服务器再正确也白搭。TP6 和 TP5.x 的关键配置项位置和默认值不同,容易混淆。
立即学习“PHP免费学习笔记(深入)”;
-
'url_route_on' => true是基础,但 TP6 默认已开,TP5.x 需手动取消注释 -
'pathinfo_depr' => '/'必须和重写规则里的分隔符一致;如果 Nginx 规则用s=$1,这里就不能设成'-' -
'url_html_suffix' => ''(空字符串)最安全,设成'html'会导致所有 URL 强制加.html,和通用伪静态冲突 - TP6 不再读
config.php里的旧配置项,别去改url_route_must这类 TP5.x 才用的键
调试时怎么看是不是真生效了
别只看地址栏有没有 index.php,那只是表象。真正要看的是请求是否进到了框架路由层。
- 在控制器方法开头加
dump(request()->url()); die;,访问/user/profile,输出应为完整路径(如/user/profile),而不是/index.php/user/profile - 查看 Nginx error log 或 Apache error log,出现
rewrite or internal redirection cycle说明重写规则形成死循环 - 用
curl -I http://your.site/test-route看响应头,状态码是 200 且没有Location:跳转,才算真正命中伪静态 - 如果首页能访问、子页面 404,大概率是
public目录没设为网站根目录,Nginx/Apache 指向了项目根而非public
最容易被忽略的是:ThinkPHP 的伪静态本质是“把所有非真实文件请求都交给 index.php 处理”,所以 public 必须是 Web 服务器的实际 DocumentRoot,任何一层路径错位都会让重写规则失效。

