nginx 不读 .htaccess 文件,其伪静态规则需转换为 location + rewrite 语法,且 wordpress 等框架还需正确配置 fastcgi_split_path_info 等参数才能正常路由。

Apache 的 .htaccess 规则为什么在 Nginx 下不生效
因为 Nginx 根本不读 .htaccess 文件,它没有 Apache 那套目录级重写机制。宝塔面板里“伪静态”配置框填的其实是 Nginx 的 location + rewrite 规则,不是直接粘贴 Apache 规则就能用的。
常见错误现象:404(如 WordPress 文章页打不开)、500(规则语法错)、后台跳转回首页(重定向循环)。这些基本都是规则没转对,或没加到正确位置导致的。
- Apache 的
RewriteRule是基于当前目录路径匹配的;Nginx 的rewrite默认基于整个 URI(以/开头),需注意前导斜杠和路径上下文 -
RewriteCond在 Nginx 中要拆成if+rewrite,但if在location块中受限,优先用try_files替代 - 宝塔的伪静态配置实际插入在站点配置文件的
server块末尾,不能覆盖已有的location ~ \.php$等关键块
WordPress 的 Apache 规则怎么转成 Nginx 可用格式
典型 Apache .htaccess 片段:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
对应 Nginx 伪静态配置(直接粘贴进宝塔「伪静态」输入框):
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php last;
}
说明:
-
!-e $request_filename同时覆盖了 Apache 的!-f和!-d判断(Nginx 中文件/目录存在性检查统一用-e) -
last表示内部重写,不改变浏览器 URL;用redirect会变成 302 跳转,容易引发循环 - 不要写
rewrite ^/index\.php$ -这类无意义规则——Nginx 不需要跳过index.php,PHP 处理器本身就会接管
ThinkPHP、Laravel 等框架的重写规则转换要点
这类框架通常依赖 PATH_INFO 或 QUERY_STRING 传参,Nginx 需确保 PATH_INFO 正确传递给 PHP,否则 $_SERVER['PATH_INFO'] 为空,路由失效。
宝塔默认的 PHP 配置里,fastcgi_param SCRIPT_FILENAME 是正确的,但常漏掉 fastcgi_split_path_info。所以不能只靠伪静态框,还得改配置文件:
- 在宝塔「网站」→「设置」→「配置文件」中,找到
location ~ \.php($|/)块 - 确认里面有这三行(缺一不可):
fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- ThinkPHP 5.1+ 推荐用
try_files $uri $uri/ /index.php?$query_string;替代if,性能更好且避免 if 陷阱
调试伪静态失败时该看哪里
别只盯着伪静态框,Nginx 重写失败往往卡在更底层:
- 先看宝塔「网站」→「日志」→「错误日志」,搜索
rewrite or internal redirection cycle(循环重定向)或no such file or directory(路径拼错) - 确认伪静态规则已生效:执行
nginx -t(宝塔终端里运行),提示successful才算语法通过 - 临时把伪静态清空,用最简规则测试:
rewrite ^/test$ /index.php?m=test last;
,再访问/test,能触发就说明基础链路通了 - 如果用了多级子目录(比如
http://a.com/blog/),Nginx 规则里的路径必须带前缀/blog,而 Apache 的RewriteBase /blog/是自动修正的,这点极易忽略
真正麻烦的从来不是规则怎么写,而是 Nginx 不像 Apache 那样允许每个目录下放独立配置,所有逻辑都得塞进一个 server 块里,稍不留神就互相干扰。










