【问题标题】:.htaccess redirects aren't respecting my regex.htaccess 重定向不尊重我的正则表达式
【发布时间】:2019-03-21 16:36:44
【问题描述】:

我需要将任何带有查询字符串的请求从一组原始 URL 重定向回感谢页面。

比如我需要重定向:
http://example.com/test1/test2/[origin]/?id=1
返回
http://example.com/thank-you

我在 .htaccess 文件中的设置方式如下:

RewriteEngine On
RedirectMatch 302 ^/test1/test2/(.*)/.+ /thank-you

我已经测试了我在在线正则表达式测试器中使用的正则表达式,它似乎按预期工作,所以我对为什么没有发生重定向感到困惑。 Here's the link to that.

显然,我必须在正则表达式测试器中添加反斜杠来转义 URL 中的斜杠,但根据我对 .htaccess 如何评估正则表达式的理解,这些不是必需的。

我的问题是:如果我从正则表达式字符串的末尾删除.+,则重定向可以在没有查询字符串的页面上完美运行,这意味着正则表达式的开头部分可以正常工作。我不明白为什么查询字符串与我创建的正则表达式不匹配。

我也试过了:

RewriteCond %{REQUEST_URI} ^/test1/test2/(.*)/
RewriteCond %{QUERY_STRING} id=([0-9]+) [NC]
RewriteRule (.*) /thank-you [R=302,L]

【问题讨论】:

  • 不,.htaccess 不使用双引号,它只是使用未转义的空格来分隔参数。
  • 您的第二组代码(RewriteRule)可以使用标志[R=302,L,QSD]
  • @IanCZane 你的第二条规则,只添加?在目标感谢之后,你喜欢这个感谢吗?

标签: regex .htaccess query-string


【解决方案1】:

对于您的 RedirectMatch,您可以使用:

RedirectMatch 302 ^/test1/test2/(.*)/(.*)+ /thank-you?

对于您的 RewriteRule 部分,您可以使用:

RewriteCond %{REQUEST_URI} ^/test1/test2/(.*)/
RewriteCond %{QUERY_STRING} id=([0-9]+) [NC]
RewriteRule (.*) /thank-you [R=302,L,QSD]

【讨论】:

    【解决方案2】:

    首先,不需要RewriteEngine Onmod_alias,在你的规则中是RedirectMatch 使用它和mod_rewrite,第二个规则。

    试试这个:

    RewriteEngine On
    RewriteCond %{QUERY_STRING} ^id=([0-9]+)$ [NC]
    RewriteRule ^test1/test2/[^\/]+/$ /thank-you? [R=302,L]
    

    我使用^id=([0-9]+)$ 来限制以id 开头并以numerical value 结尾的查询字符串。

    我删除这行 RewriteCond %{REQUEST_URI} ^/test1/test2/(.*)/ 因为你也可以匹配 RewriteRule 中的 URI。

    如果此规则有效,请将 [R=302,L] 更改为 [R=301,L] 以永久重定向。

    注意:清除浏览器缓存然后测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 2011-08-30
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      相关资源
      最近更新 更多