重定向匹配和重定向相互干扰
在您给出的示例中,RedirectMatch
(mod\\u别名)和RewriteRule
(mod\\u rewrite)是“相互干扰”,而不是Redirect
. Redirect
是一个mod\\u alias指令,可用于RedirectMatch
- 所以你不一定会认为这些会以这种方式发生冲突。
如上所述,RewriteRule
是mod\\u rewrite指令,而RedirectMatch
(和Redirect
) 是mod\\u alias指令。不同的Apache模块在请求期间的不同时间独立执行,而不考虑.htaccess
文件对于mod\\u alias和mod\\u rewrite,mod\\u rewrite总是先执行。
因此,在您的示例中RewriteRule
(第二条指令)将在RedirectMatch
前面的指令-因为它们都匹配URL/datingstories
. 然后继续处理该文件,当第一个mod\\u别名RedirectMatch
重定向URL(RedirectMatch
匹配请求中的URL,而不是重写的URL。所以,这符合/datingstories
再说一次,不是showprofile.php
- 重写的URL)。这将替换重写的URL路径(showprofile.php
) 但保留查询字符串(?username=dating
). (然而,从你发布的指令中不清楚,为什么datingstories
将被截断为dating
在URL参数中-可能与其他指令有冲突。)在应用301 HTTP状态后,早期的重写将转换为外部重定向。
这里的教训是,你不应该混合使用这两个模块的重定向/重写,以避免类似这样的混淆冲突。由于WordPress的前端控制器使用mod\\u rewrite,因此您最好始终使用mod\\u rewrite。因此,您应该转换任何mod\\u别名RedirectMatch
(和Redirect
) 使用mod\\u rewrite的指令RewriteRule
相反
例如:
RewriteRule ^datingstories /blog/category/relationships/datingstories/ [R=301,L]
RewriteRule ^([a-zA-Z0-9_-]+)$ showprofile.php?username=$1 [L]
不要忽视
L
标志-在需要时停止进一步处理(当前通过文件)。