【问题标题】:Htaccess - Rewrite and Redirect URL with PHP GET variableHtaccess - 使用 PHP GET 变量重写和重定向 URL
【发布时间】:2016-08-10 16:03:33
【问题描述】:

我正在尝试重写和重定向此 URL:

https://www.domain.com/video-lessons-page.php?item=stocks

去这个网址:

https://www.domain.com/stocks-video-lessons

这是我目前正在使用的代码:

RewriteCond %{QUERY_STRING} ^item=([^&]+)
RewriteRule ^/?video-lessons-page\.php$ https://www.domain.com/%1-video-lessons? [R=301,L]
RewriteRule ^(stocks|finance|accounting)-video-lessons$ video-lessons-page.php?item=$1 [NC,L]

不幸的是,上面的代码我遇到了问题。前两行本身很好用,因为它将/video-lessons-page.php?item=stocks 重定向到/stocks-video-lessons

第三行本身也非常适用于 /stocks-video-lessons URL 与 GET 变量和页面代码一起正常工作的地方。

但是将它们放在一起是有问题的。现在我收到诸如“www.domain.com 重定向您太​​多次”之类的错误。等等。有什么想法吗?

【问题讨论】:

    标签: php .htaccess redirect mod-rewrite get


    【解决方案1】:

    澄清一下,大概您已经将所有内部 URL 更改为 /stocks-video-lessons 形式,外部重定向的原因是因为“丑陋”的 URL 已经被编入索引并在外部链接?


    正如你所发现的,你得到了一个重定向循环,因为这两个规则冲突并且它不断地从一个重定向/重写到另一个。

    当只有初始请求包含 URL /video-lessons-page.php,而不是重写的 URL(这就是这里发生的情况)时,您需要重定向。您可以通过检查 THE_REQUEST 服务器变量(包含浏览器发送的完整 HTTP 请求)来检查初始请求。

    类似于以下内容:

    RewriteCond %{THE_REQUEST} /video-lessons-page\.php?item=(\w+)
    RewriteRule ^video-lessons-page\.php$ https://www.example.com/%1-video-lessons? [R=301,L]
    
    RewriteRule ^(stocks|finance|accounting)-video-lessons$ video-lessons-page.php?item=$1 [L]
    

    请注意,您必须在测试前清除浏览器缓存,因为 301(永久)重定向将被浏览器缓存。 (通常使用 302 重定向更容易测试。)如果您特别需要不区分大小写的匹配,请仅使用 NC 标志。

    更新:我已将查询字符串参数值的正则表达式从 ([^&]+) 更改为更严格的 (\w+)。 \w 是单词字符的简写字符类(自然不包括 & 和关键的空格)。由于THE_REQUEST 包含以下形式的字符串:

    GET /video-lessons-page.php?item=stocks HTTP/1.1
    

    ...我们需要停止捕获 before 空间。之前的模式([^&]+) 将捕获到字符串末尾的所有内容,即。 “股票 HTTP/1.1”。所以,我会预计 404,因为会发生无效重定向但内部重写会失败。 (?)

    【讨论】:

    • 是的,丑陋的 URL 已经被编入索引。这一切实际上很有意义,谢谢你的帮助。出于某种原因,尽管使用您拥有的代码,实际的重定向并没有从/video-lessons-page.php?item=stocks 发生到/stocks-video-lessons。它只是停留在丑陋的 URL 上。我每次都会刷新我的缓存。
    • 啊,好的,是的,确实...查询字符串参数值上的正则表达式在用于匹配THE_REQUEST 时需要更新 - 我已经更新了我的答案。但是,我预计会出现 404,而不是 redirect? 失败
    【解决方案2】:

    感谢 w3dk 的指导,我想通了,除了 THE_REQUEST 之外,只需要一个 QUERY_STRING 即可。

    最终代码:

    RewriteCond %{THE_REQUEST} video-lessons-page\.php
    RewriteCond %{QUERY_STRING} ^item=([^&]+)
    RewriteRule ^video-lessons-page\.php$ https://www.example.com/%1-video-lessons? [R=301,L]
    RewriteRule ^(stocks|finance|accounting)-video-lessons$ video-lessons-page.php?item=$1 [L]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 2017-06-16
      • 1970-01-01
      • 2011-12-02
      相关资源
      最近更新 更多