thinkphp伪静态在hetzner不生效,因hetzner默认用nginx而非apache,.htaccess无效;需在server块location /内配置try_files $uri $uri/ /index.php?$query_string;,并关闭path_info模式、验证nginx语法后重载。

ThinkPHP 伪静态在 Hetzner 服务器上为什么默认不生效
因为 Hetzner 默认用的是 Nginx,而 ThinkPHP 的 .htaccess 文件只对 Apache 生效;Nginx 不读 .htaccess,也不会自动加载 rewrite 规则。你直接把 Apache 的规则丢进 Hetzner 的 Nginx 配置里,大概率会 404 或 500 —— 这不是 ThinkPHP 的问题,是服务器类型和配置方式错配。
Nginx 配置文件里必须加的三行核心规则
进入 Hetzner 的 Nginx 虚拟主机配置(通常是 /etc/nginx/sites-available/your-site),在 server 块的 location / 区域内写入:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
这三行的作用是:优先尝试找真实文件或目录,找不到就交给 index.php 处理,并把原始查询参数($query_string)完整透传过去。ThinkPHP 的路由解析依赖这个参数,不能简写成 /index.php 或漏掉 $query_string。
常见错误包括:
- 写成
try_files $uri $uri/ /index.php;—— 缺少$query_string,导致$_GET为空,路由匹配失败 - 写成
rewrite ^(.*)$ /index.php?s=$1 last;—— 这是旧版 ThinkPHP 3.x 的写法,TP5/6 已弃用s=参数,硬套会 404 - 把规则放在
location ~ \.php$里 —— 这个 location 是处理 PHP 文件执行的,不是 URL 重写的入口,放错位置无效
ThinkPHP 自身还要关掉 PATH_INFO 模式
即使 Nginx 规则写对了,如果 ThinkPHP 还在用 PATH_INFO 解析路由(比如访问 /index.php/user/index),就会和 Nginx 的 try_files 冲突。你需要显式关闭它:
在 config/app.php 中确认以下两项:
'url_route_on' => true,'url_common_param' => false,-
'url_html_suffix' => 'html',(可选,按需设置后缀) - 最关键的是:
'pathinfo_fetch' => ['QUERY_STRING'],—— 确保只从QUERY_STRING取参数,不依赖 PATH_INFO
如果你用的是 ThinkPHP 6,还要检查 config/route.php 是否启用了 think\Route::rule() 定义的规则,而不是靠 index.php/xxx 这种路径段驱动。
Hetzner 上 reload Nginx 前必须验证语法
Hetzner 的 Nginx 配置一旦出错,systemctl reload nginx 会静默失败,网站直接 502。每次改完必须手动验证:
sudo nginx -t
只有输出 nginx: configuration file /etc/nginx/nginx.conf test is successful 才能继续 reload。别跳过这步 —— Hetzner 的默认 Nginx 配置里可能有多个 include,某处多一个分号或少一个分号,整站就挂。
另外注意:Hetzner 的 Ubuntu/CentOS 镜像通常用 systemd 管理服务,不要用 service nginx reload,统一用:
sudo systemctl reload nginx
最后提醒一点:Hetzner 的 VPS 有些预装了 Apache(尤其旧镜像),务必先运行 sudo systemctl stop apache2 && sudo systemctl disable apache2,否则 Nginx 启动不了(80 端口被占)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











