【问题标题】:What is wrong with this simple rewrite rule that doesnt redirect?这个不重定向的简单重写规则有什么问题?
【发布时间】:2018-10-12 12:59:48
【问题描述】:

大家好,

我正在努力理解这个不起作用的简单规则有什么问题。 我有一个具有类似 URL 的网站:site.com/support,我现在想将所有 URL site.com 重定向到 site.com/en,site.com/support/ 到 site.com/en/support/, ....

经过多次尝试和搜索,我想出了以下两条规则:

RewriteRule ^(?![a-z]{2}/)(.*)$ /en/$1 [R=301,L] # redirect to default language
RewriteRule ^([a-z]{2})/(.*)$ /$2?lang=$1 [QSA,L]

这些规则中的每一个都可以完美地单独工作,但在组合时会导致过多的重定向 (?lang=en&lang=en&lang=en...)

谁能告诉我怎么回事?

谢谢

【问题讨论】:

  • 你试过这个吗? stackoverflow.com/a/1689294
  • 嗨,除了参考链接中的解决方案之外,还有其他解决方案吗,因为它不符合我的第二条规则,而且真的无法弄清楚出了什么问题! :(

标签: regex .htaccess url-rewriting


【解决方案1】:

问题是两个规则都在修改REQUEST_URI并导致彼此重复执行,直到浏览器检测到重定向循环并停止重定向并出现错误。

您可以使用以下方法修复它:

RewriteEngine On

# redirect to default language
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteRule ^(?![a-z]{2}/)(.*)$ /en/$1 [R=301,L,NE]

RewriteRule ^([a-z]{2})/(.*)$ /$2?lang=$1 [QSA,L]

RewriteCond %{ENV:REDIRECT_STATUS} !200 条件将阻止重定向循环,因为 Apache 将在第一次成功执行第一条规则后将 REDIRECT_STATUS 环境变量设置为 200

【讨论】:

  • OMG,千感谢@anubhava,不知道如何感谢你:) 它运行良好。谢谢,谢谢,谢谢:)))))我简直不敢相信它的工作。你是我的救星:))
  • 您好,我有一个坏消息,重定向会在大约 5 分钟后导致服务器崩溃。我不得不回滚到以前的版本:(知道那可能是什么吗?
  • 嘿@anubhava,你好吗?我终于让它工作了,这是由于负载均衡器没有返回 200 响应,这就是它不能正常工作的原因......所以再次感谢你的时间和帮助。干杯:)
  • 啊,好吧,很抱歉:S OK,我会做一些研究,如果我没有成功,那么我会创建一个新问题 :) 干杯
  • 不可能让它工作,所以我提出了一个新问题:stackoverflow.com/questions/52892995/…
猜你喜欢
  • 2010-12-09
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多