.htaccess Rewrite规则失效:原始URL可用,重写URL无法访问
解决多级URL重写问题
这个问题我熟,你的.htaccess规则里的正则表达式限制了只能捕获单段路径,没法处理带斜杠的多级URL(比如/auth/login)。咱们来调整一下规则就能解决:
修改后的.htaccess代码
<IfModule mod_rewrite.c> RewriteEngine On <IfModule mod_negotiation.c> Options -Indexes </IfModule> # 排除真实存在的目录和文件 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f # 捕获所有多级路径,传递给page参数 RewriteRule ^(.+)$ index.php?page=$1 [QSA,L] </IfModule>
关键修改点说明
- 修正条件空格:原来的
RewriteCond %{REQUEST_FILENAME}!-d缺少空格,改成RewriteCond %{REQUEST_FILENAME} !-d,确保mod_rewrite能正确识别规则条件。 - 调整正则表达式:把原来的
^([^/]+)/?$换成^(.+)$,[^/]+会排除斜杠,只能匹配单段路径;而.+可以匹配任意长度的字符(包括斜杠),完美捕获auth/login这类多级路径。 - 保留必要标记:
QSA会保留原URL中的查询参数(比如/auth/login?foo=bar会被重写成index.php?page=auth/login&foo=bar),L表示这是最后一条规则,避免后续规则干扰。
这样修改后,访问/auth/login就会被正确重写成/index.php?page=auth/login,和你手动访问的原始URL效果完全一致,index.php就能正常加载对应目录的文件了。
内容的提问来源于stack exchange,提问作者drip drip
相关产品推荐
相关产品推荐

