重定向匹配和重定向相互干扰

时间:2018-07-20 作者:E.Hoh

我的.htaccess (还有其他行,但这两行相邻)

RedirectMatch 301 ^/datingstories https://example.com/blog/category/relationships/datingstories/
RewriteRule ^([a-zA-Z0-9_-]+)$ showprofile.php?username=$1
网站上有一个WordPress博客组件(在/blog) 以及在WordPress之外构建的amembership和profile页面https://example.com/datingstories 翻译成博客的约会子类别。这也是外部共享的(这就是为什么我想要更短的URL)
  • 第二行将sitename/username转换为sitename/showprofile.php?username=username. 网站上有成员档案页,URL被简化(即。https://example.com/frank 重定向到https://example.com/showprofile.php?username=frank). 但是,浏览器上的URL显示https://example.com/frank
  • 问题在于何时https://example.com/datingstories 单击/链接到,则生成的URL为https://example.com/blog/category/relationships/datingstories/?username=dating

    当页面仍在加载时,是否有任何方法可以防止?username=dating 显示为结果URL的一部分。我想第二个.htaccess 规则正在应用,但我不确定如何应用showprofile.php 未显示在结果URL中。

    此外,理想情况下,如果生成的页面显示的URL较短而不是较长的URL,那就太好了。

    非常感谢您抽出时间来查看和回复此消息。

    1 个回复
    最合适的回答,由SO网友:MrWhite 整理而成

    重定向匹配和重定向相互干扰

    在您给出的示例中,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 标志-在需要时停止进一步处理(当前通过文件)。

    结束

    相关推荐

    search form redirects to home

    Update 案件已结案。我忘了我的函数中有kill函数。php将附件、搜索、作者、每日存档页面重定向到主页。删除了用于搜索的部件,效果良好。很抱歉,感谢您的时间和帮助:)我在wordpress中有一个简单的搜索表单<form role=\"search\" method=\"get\" class=\"search-form\" action=\"<?php echo home_url( \'/\' ); ?>\"> <label> <