Apache vhosts配置RewriteCond忽略部分URL

时间:2012-09-24 13:19:29

标签: apache .htaccess redirect vhosts apache-config

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

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

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

如何更改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]

1 个答案:

答案 0 :(得分:0)

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

以下是我建议您尝试的内容:

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

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

如果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相结合。

相关问题