如何用mod_rewrite实现仅新目录有对应文件时重定向旧URL?
mod_rewrite 实现旧URL跳转与新目录兼容方案
完全可以实现你的需求,在.htaccess中通过mod_rewrite规则就能完成逻辑判断,以下是具体配置:
RewriteEngine On # 提取foo路径后的部分,存入环境变量OLD_PATH RewriteRule ^foo/(.*)$ - [E=OLD_PATH:$1] # 检查bar目录下对应的文件或目录是否存在 RewriteCond %{DOCUMENT_ROOT}/bar/%{ENV:OLD_PATH} -f [OR] RewriteCond %{DOCUMENT_ROOT}/bar/%{ENV:OLD_PATH} -d # 存在则301永久重定向到bar对应路径 RewriteRule ^foo/(.*)$ /bar/$1 [R=301,L]
规则拆解
- 第一条规则:将请求路径中
foo/之后的部分(比如subfoo/example.html)存入环境变量OLD_PATH,方便后续复用。 - 两条
RewriteCond:分别检查网站根目录下的bar/{OLD_PATH}是否为存在的文件(-f)或目录(-d),[OR]表示满足任一条件即可触发后续重写。 - 第二条规则:当条件满足时,将原请求
foo/xxx永久重定向到bar/xxx,R=301是永久重定向(利于搜索引擎更新索引),L表示执行完这条规则后停止后续规则处理。 - 若
bar下的对应资源不存在,规则不会触发,Apache会自动去新的foo目录下查找对应资源,符合你的需求。
注意事项
- 确保Apache已启用mod_rewrite模块,且网站根目录的Apache配置中设置了
AllowOverride All,否则.htaccess规则无法生效。 - 测试阶段可以将
R=301改为R=302临时重定向,确认逻辑正确后再换回永久重定向。 %{DOCUMENT_ROOT}指向Apache的网站根目录,确保路径拼接正确,避免因相对路径导致的检查错误。
内容的提问来源于stack exchange,提问作者Se7enDays
相关产品推荐
相关产品推荐

