【问题标题】:Apache vhosts config RewriteCond to ignore part of URLApache vhosts 配置 RewriteCond 以忽略部分 URL
【发布时间】:2012-09-15 23:07:47
【问题描述】:

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

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

复杂性是当我添加行 RewriteCond %{REQUEST_URI} !^/cm 时,这会被 RewriteCond 捕获,但是我无法访问 /fr/de/es陷入循环并转到:www.ayrshireminis.com/fr/fr/fr/fr/fr/fr/fr/fr,然后是 HTTP 500 Internal Server Errors。

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

【问题讨论】:

  • 你要去哪个 URL 导致你被重定向到 www.ayrshireminis.com/fr/fr/fr/fr/fr/fr/fr/fr

标签: apache .htaccess redirect vhosts apache-config


【解决方案1】:

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

我建议您尝试以下方法:

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

我更喜欢使用“守护者”模式来丢弃任何从一开始就不会触及的东西。您列出的指令的逻辑似乎存在错误。前两个指令似乎是说“如果 REQUEST_URI 以 only 两个字符 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。

【讨论】:

    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多