如何用.htaccess的RewriteRule精确匹配contact避免重定向循环?
解决.htaccess重定向循环与精准匹配问题
我懂你现在的困扰——之前的规则因为匹配范围太宽,导致重定向循环,还误匹配了其他带contact的路径。咱们直接调整规则,精准锁定目标:
修改后的完整规则
RewriteEngine On RewriteBase / # 处理带语言前缀的URL,内部转发到PHP文件 RewriteRule ^en/contact$ /contact.php?lang=en&slug=ok [L,NC] # 仅精确匹配/contact,301重定向到带语言前缀的路径 RewriteCond %{REQUEST_URI} !^/en/contact$ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^contact$ /en/contact [L,R=301]
关键调整说明
- 精确匹配控制:所有规则都加上
$结尾(比如^en/contact$和^contact$),确保只匹配完全等于该路径的请求,不会触发/contactme、/contact/xxx这类包含contact的URL。 - 解决循环的核心条件:
RewriteCond %{REQUEST_URI} !^/en/contact$:排除已经是/en/contact的请求,避免重定向后再次触发规则。RewriteCond %{REQUEST_FILENAME} !-f:跳过服务器上真实存在的文件(比如contact.php),这就是之前导致循环的根本原因——内部重写后的请求被第二条规则再次匹配了。
- 保持原有功能:第一条规则依然负责把
/en/contact内部转发到contact.php带参数的逻辑,不影响内容加载。
这样调整后,就完全符合你的需求:访问www.example.com/contact会301跳转到www.example.com/en/contact,后者正常加载对应PHP内容,不会出现循环,也不会误匹配其他路径。
内容的提问来源于stack exchange,提问作者Tronix
相关产品推荐
相关产品推荐

