0

我正在尝试使用 Apache vhosts 配置控制我网站上的重定向。

我有两个字母的区域设置,例如/fr, /de, /es,我目前正在忽略它,您将从下面的 vhosts 文件中看到。但是,我也有一个 301 永久重定向设置来重定向 /cm (和/fr/cm/es/cm等等)到另一个页面 - 这是在我的后端系统中控制的。

复杂之处在于,当我添加被 RewriteCond 捕获的行时,RewriteCond %{REQUEST_URI} !^/cm然后我根本无法访问/fr,/de因为它们似乎陷入了循环并转到:然后是 HTTP 500 内部服务器错误。/eswww.ayrshireminis.com/fr/fr/fr/fr/fr/fr/fr/fr

我如何更改 RewriteCond 以允许:

  • /pa(这将被重定向到 /minis,但它在数据库中控制,需要保持为有效 URL)
  • /fr(地区)
  • /fr/pa
  • /es/pa

等等

    # ----------------------------------------------------------------------
    # REGION SPECIFIC REDIRECTIONS
    # Below will remove region specific part of URL and load content from main UK site
    # ----------------------------------------------------------------------
    RewriteCond             %{REQUEST_URI}                  ^/([a-z]{2})$                   [OR]
    RewriteCond             %{REQUEST_URI}                  ^/([a-z]{2}/)(.*)$
    RewriteCond             %{REQUEST_URI}                  !^/cm
    RewriteRule             ^([a-z]{2}/|[a-z]{2})(.*)$      /$2                                             [L,QSA]

    # For VirtualDocumentRoot development instance configurations
    RewriteRule ^([^.]+)$ /index.php?url=$1 [L,QSA]
4

1 回答 1

0

我想我在这里看到了你的麻烦。您问题的格式似乎掩盖了第一行[OR] 末尾的和RewriteRule 本身的 。RewriteCond[L,QSA]

这是我建议您尝试的方法:

RewriteCond %{REQUEST_URI} !^/cm
RewriteCond %{REQUEST_URI} ^/([a-z]{2})/?(.*)$
RewriteRule .*   $2 [L,QSA]

我更喜欢使用“守护者”模式来丢弃任何从一开始就不会触及的东西。您列出的指令的逻辑似乎存在错误。前两个指令似乎是说“如果 REQUEST_URI仅以两个字符开头,或者它仅以两个字符开头,有一个“/”,然后直到最后,然后继续处理。

如果 REQUEST_URI 是“/fr”,它将匹配RewriteCond您在问题中包含的第一个指令。但如果它确实符合这个,那么它会做什么呢?如果您要重写第二个括号分组,并且如果模式没有检测到第二个括号分组,那么如果没有要重定向的内容,如何进行任何重定向?然后,该请求将在您的配置中进一步传递给后续的重写规则。

我也觉得RewriteRule可能不好。在您当前的指令中,您可能应该拥有:

RewriteRule ^/([a-z]{2}/|[a-z]{2})(.*)$ /$2 [L,QSA]

您可能应该添加前导“/”字符,否则“$2”可能会匹配整个 REQUEST_URI。REQUEST_URI 应始终以“/”开头。

您可能已经尝试过,但建议您启用更详细的日志记录,tail当您将模式输入浏览器并点击该站点时,该日志文件以查看模式是否匹配。我目前使用这个:

RewriteEngine On
RewriteLog /usr/local/apache2/logs/rewrite.log
RewriteLogLevel 3

我无法解释为什么您最终会进入重定向循环,因为[L]应该防止这种情况发生。我能想到的唯一一件事是,如果您的应用程序的其他方面,在这些指令之外,涉及重定向,它们可能会以某种方式引发这种行为,并将请求反馈给 Apache。更详细的日志记录可能有助于隔离它,再加上您的 access_log。

于 2012-09-25T01:31:06.660 回答