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