Htaccess - 使用PHP GET变量重写和重定向URL

时间:2016-08-10 00:34:47

标签: php .htaccess redirect mod-rewrite get

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

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重定向了你太多次了。"等任何想法?

2 个答案:

答案 0 :(得分:1)

只是澄清一下,可能您已将所有内部网址更改为/stocks-video-lessons格式,并且外部重定向的原因是因为“丑陋”的网址已被编入索引,外部联系?

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

当只有初始请求包含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

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

答案 1 :(得分:0)

感谢w3dk的指导,我明白了,除了using Microsoft.Exchange.WebServices.Data; string EmailAddress = ConfigurationManager.AppSettings["EmailAddress"]; string DomainUser= ConfigurationManager.AppSettings["SIGNUM"]; string DomainPass= ConfigurationManager.AppSettings["SIGNUMPassword"]; string NetworkDomain = ConfigurationManager.AppSettings["NetworkDomain"]; ExchangeService exchange = new ExchangeService(ExchangeVersion.Exchange2010); exchange.Credentials = new WebCredentials(DomainUser, DomainPass, NetworkDomain); exchange.Url = new Uri("https://oa-am.msg.xxxxxxx.com/EWS/Exchange.asmx"); 之外,只需要QUERY_STRING留下来。

最终代码:

THE_REQUEST