Apache vhosts配置重写忽略URL的一部分

Apache vhosts配置重写忽略URL的一部分,apache,.htaccess,redirect,vhosts,apache-config,Apache,.htaccess,Redirect,Vhosts,Apache Config,我正在尝试使用Apache vhosts配置控制站点上的重定向 我有两个字母区域设置,例如/fr,/de,/es,我目前正在忽略它们,您将从下面的vhosts文件中看到。但是,我还有一个301永久重定向设置,可以将/cm(以及/fr/cm,/es/cm等)重定向到另一个页面-这在我的后端系统中进行控制 复杂的是当我添加行RewriteCond%{REQUEST\u URI}时^/cm这被RewriteCond捕获,但是我无法访问/fr、/de、/es等,因为它们似乎陷入了一个循环,并转到:www

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

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

复杂的是当我添加行
RewriteCond%{REQUEST\u URI}时^/cm
这被RewriteCond捕获,但是我无法访问
/fr
/de
/es
等,因为它们似乎陷入了一个循环,并转到:
www.ayrshireminis.com/fr/fr/fr/fr/fr
,然后它会显示HTTP 500内部服务器错误

如何更改重写条件以允许:

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


我想我看到你的麻烦了。您问题的格式似乎模糊了
[或]
在您的第一行
RewriteCond
的末尾,以及RewriteRule本身上的
[L,QSA]

以下是我建议您尝试的:

RewriteCond %{REQUEST_URI} !^/cm
RewriteCond %{REQUEST_URI} ^/([a-z]{2})/?(.*)$
RewriteRule .*   $2 [L,QSA]
我更喜欢使用“守护者”模式来丢弃任何从一开始就不会被触及的东西。您列出的指令的逻辑似乎有错误。前两条指令似乎表示“如果请求URI仅以两个字符开头,则以“/”开头,直到结尾,然后继续处理。”

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

我还认为重写规则可能不好。在当前的指令中,您可能应该:

RewriteRule ^/([a-z]{2}/|[a-z]{2})(.*)$ /$2 [L,QSA]
您可能应该添加一个前导“/”字符,否则“$2”可能会与整个请求URI匹配。请求URI应始终以“/”开头

您可能已经尝试过这种方法,但建议您启用更详细的日志记录,
tail
在您将模式输入浏览器并访问站点时,查看模式是否匹配。我目前使用的是:

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

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

您将要访问的哪个URL导致您被重定向到
www.ayrshireminis.com/fr/fr/fr/fr/fr/fr
RewriteEngine On
RewriteLog /usr/local/apache2/logs/rewrite.log
RewriteLogLevel 3