thinkphp url重写
```html 打开 ThinkPHP 的 URL 重写本质就两件事:让服务器把 项目根目录放一个 关键是那两个 另外确认 Apache 加载了 Nginx 不用 如果 PHP-FPM 和 Nginx 不在同一台机器, 重写只是入口层面的事。ThinkPHP 自己的路由才是控制 URL 形态的主力。比如: 访问 但别把路由写得太细。见过一个项目给每个页面都配了独立规则,两百多条,维护的人跑路了后面没人敢动。能用资源路由就用 Linux 服务器区分大小写, 伪静态后缀 重写不生效时,先看 另一个坑是 说到底,URL 重写不是 ThinkPHP 独有的东西,它依赖服务器配置和框架路由的配合。服务器那层负责把请求交给 config/app.php,找到 'url_route_on' => true 这一行。如果是 false,改成 true。这一步不做,后面全白搭。/index.php/Index/index 这种带入口文件的地址,变成 /index/index 这种干净路径;同时让路由规则真正生效,而不是靠 PATH_INFO 硬扛。Apache 下的 .htaccess
.htaccess,内容如下:<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{ REQUEST_FILENAME} !-f RewriteCond %{ REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L] </IfModule>RewriteCond。第一个排除真实存在的文件,第二个排除真实存在的目录。少了它们,CSS、JS、图片全会被重写规则吞掉,页面直接裸奔。我见过有人只写 RewriteRule,结果 /static/css/app.css 返回首页 HTML,浏览器控制台一片红。mod_rewrite。Ubuntu 下 a2enmod rewrite,然后重启。别问我怎么知道的,调了两小时才发现模块没开。Nginx 的 try_files
.htaccess,在站点配置的 server 块里加:location / { try_files $uri $uri/ /index.php$is_args$args; }try_files 依次找文件、找目录,都找不到才丢给 index.php。注意 $is_args$args 不能省,否则 ?id=5 这种查询串会丢。有次线上分页全跳到第一页,就是因为漏了这段。fastcgi_pass 那行得改成实际地址。fastcgi_param SCRIPT_FILENAME 也要指向正确的项目路径,写错了就是 502。路由规则别写太死
Route::rule('blog/:id', 'index/Blog/read');/blog/42 就能映射到 Blog 控制器的 read 方法,id 自动注入。比 /index.php/index/blog/read/id/42 清爽太多。Route::resource,能用分组就用分组,规则数量控制在二十条以内比较舒服。URL 大小写和伪静态后缀
/Index/Index 和 /index/index 是两个地址。配置里 'url_convert' => true 会自动转小写,但只在路由解析阶段生效,重写阶段还是得靠服务器规则。干脆统一用小写,省心。'url_html_suffix' => 'html' 能让 /blog/42.html 正常访问。但注意,如果同时开启了路由和这个配置,.html 会被当作参数的一部分,得在路由规则里显式处理,否则匹配不上。调试技巧
$_SERVER['REQUEST_URI'] 是什么。在入口文件 public/index.php 顶部加一行 var_dump($_SERVER['REQUEST_URI']);exit;,能快速判断是服务器没重写,还是重写后框架没解析对。PATH_INFO。某些 CGI 环境下 PATH_INFO 为空,ThinkPHP 会退回 REQUEST_URI 模式。配置里 'pathinfo_fetch' => ['ORIG_PATH_INFO', 'REDIRECT_PATH_INFO', 'REDIRECT_URL'] 可以指定获取顺序。这个在 IIS 上尤其常见。index.php,框架这层负责把路径翻译成控制器和方法。两边都对了,URL 才干净。
-
上一篇
-
下一篇