【问题标题】:Redirecting a URL that contains a question mark重定向包含问号的 URL
【发布时间】:2012-08-26 15:17:58
【问题描述】:

有必要移动我博客的位置,我正在努力确保通过旧链接捕获所有链接并将它们重定向到新链接。

博客已从http://example.com/ 移至http://example.com/blog/

用于在帖子名称之前生成日期的 URL(默认情况下),我决定不这样做,以保持 URL 令人难忘。

问题是有一个 ?原始 URL 中的字符(我正在使用的 CMS 生成的默认 URL,它会导致重定向问题:

RewriteRule ^post.php?s=2012-01-01-blog-post$ /blog/blog-post? [R=301,L]

所以我需要逃避 ?不知怎么的,但我不知道怎么做!

我可以使用更通用的重定向来避免 ?但这会重定向到列表页面,而不是文章本身:

RewriteRule ^post.php$ http://tempertemper.net/blog/? [R=301,L] 

如何让它读取?作为 URL 的一部分!?

感谢观看!

马丁 :)

【问题讨论】:

    标签: .htaccess mod-rewrite redirect http-status-code-301


    【解决方案1】:

    我认为您需要使用 RewriteCond 来检查是否存在 QUERY_STRING 值,然后假设查询字符串与您的博客模式匹配,捕获博客名称,然后在 RewriteRule 中使用捕获的值。像这样的:

    RewriteCond ${QUERY_STRING} ^s=[0-9]{4}-[0-9]{2}-[0-9]{2}-(.*)$
    RewriteRule ^post.php$ /blog/%1 [R=permanent,L]
    

    %1 指的是匹配 RewriteCond 中的第一个捕获模式(除非 RewriteCond 匹配,否则 RewriteRule 不会触发)。

    这是必要的原因是 RewriteRule 无法将查询字符串视为请求路径的一部分,因此您必须在 RewriteRule 之前使用 RewriteCond 检查(并捕获)查询字符串。

    【讨论】:

    • 您需要在%1 末尾添加一个?,否则查询字符串将附加到末尾。
    • 我用 % 替换了 {QUERY_STRING} 之前的 $ 并使用了 ?正如@jon 建议的那样,它有效!谢谢!
    • @JonLin 好电话。我忘记了将查询字符串复制到目标 URL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 2013-12-17
    • 2021-06-29
    相关资源
    最近更新 更多