【问题标题】:.htaccess: 301 redirect "instr" url parameter to path.htaccess: 301 将“instr”url 参数重定向到路径
【发布时间】:2016-02-15 20:01:35
【问题描述】:

通过.htaccess 我想301将URL中的参数“pathval”重定向到“路径”,例如:

index.php?a=1&b=2&pathval=a_text_string&c=3

到:

index.php/a_text_string

甚至更好:

index.php/a_text_string?a=1&b=2&c=3

如果“pathval”是唯一的 URL 参数,我找到了许多解决此重定向的方法

但是当 QUERY_STRING 中涉及其他参数并且所有参数可以按任何顺序并且可能包含任何价值

所以可能的调用 (1) 可能是:

  • index.php?a=1&b=2&c=3(这里没有重定向)
  • index.php?pathval=a_text_string
  • index.php?pathval=a_text_string&a=1&b=2&c=3
  • index.php?a=1&b=2&pathval=a_text_string&c=3
  • index.php?a=1&b=2&c=3&pathval=a_text_string

如果有人能给我一个适用于所有可能案例的通用解决方案,我会很高兴。

(1):在我的示例中,为了提高可见性,其他参数 a、b、c 都是数字,但这不是规则。也可能包含字符串甚至是空的。

【问题讨论】:

    标签: apache .htaccess redirect mod-rewrite


    【解决方案1】:

    您可以对问题中描述的所有情况使用此通用规则:

    RewriteEngine On
    
    RewriteCond %{THE_REQUEST} \?(.*&)?pathval=([^&]*)&?(\S*)\sHTTP [NC]
    RewriteRule ^index\.php$ %{REQUEST_URI}/%2?%1%3 [R=302,NE,L]
    

    要删除 && 或前导/尾随 &,请使用以下规则:

    RewriteCond %{QUERY_STRING} ^&|&&|&$
    RewriteCond %{QUERY_STRING} ^&?(.*?)(?:&&(.*))?&?$
    RewriteRule ^ %{REQUEST_URI}?%1&%2 [R=302,NE,L]
    

    【讨论】:

    • 感谢您的快速回答。在我的测试中,它似乎工作得很好。我发现的唯一一件事是它似乎在路径值之后留下了“&”:所以index.php?a=1&pathval=a_text_string&b=2 会导致index.php/a_text_string?a=1&&b=2index.php?pathval=a_text_string&a=1&b=2index.php/a_text_string?&a=1&b=2。有没有办法把它也去掉?
    • @Wooz 使用pathval=([^&]*)&?(\S*)\sHTTP
    • 感谢@hjpotter92(将其添加到我的答案中)
    • 感谢你们俩。现在完美运行。
    猜你喜欢
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多