Regex 正则表达式无限循环
我有一个指向两个域名的服务器。因此,在我的.htaccess文件中,我想制定一个简单的规则,说明以下内容: 如果您来自test.domain.com,则转到文件夹X,如果您来自-other-sub.domain.com,则转到文件夹Y。这意味着我正在移动其中一个子域,因此我可以使其重定向到正确的URL(如果人们正在跟踪深层链接。例如,如果人们转到Regex 正则表达式无限循环,regex,apache,.htaccess,mod-rewrite,Regex,Apache,.htaccess,Mod Rewrite,我有一个指向两个域名的服务器。因此,在我的.htaccess文件中,我想制定一个简单的规则,说明以下内容: 如果您来自test.domain.com,则转到文件夹X,如果您来自-other-sub.domain.com,则转到文件夹Y。这意味着我正在移动其中一个子域,因此我可以使其重定向到正确的URL(如果人们正在跟踪深层链接。例如,如果人们转到http://test.domain.com/path/to/a/page他们将被重定向到新文件夹中的/path/to/a/page 但我很难做到这一点
http://test.domain.com/path/to/a/page
他们将被重定向到新文件夹中的/path/to/a/page
但我很难做到这一点。我不明白的是,为什么会有这样的代码:
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^subdomain.domain.com$
RewriteRule ^(.*)$ /test/$1 [L,R=301]
离开我,所以如果我转到subdomain.domain.com/abc
,那么浏览器会将我发送到subdomain.domain.com/test/test/test/test/test/test/test/test/abc
然后抱怨我有一个无休止的循环。请不要有指向Apache的mod_rewrite.c文档的智能链接。我已经阅读了它,这就是它带给我的。我知道*意味着“匹配0或更多次”,但我不明白为什么它会一次又一次地复制目标字符串…?
/test/
不是正则表达式,是吗?那么它为什么重复它呢?如果无条件重定向到/test/…
,那么它将在重定向URL之前继续添加/test/
要修复此问题,请使用此规则:
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^subdomain\.domain\.com$ [NC]
RewriteRule ^((?!test/).*)$ /test/$1 [L,R=301,NC]
(?!test/)
是一种消极的先行条件,这意味着只有当它不是以/test/
开头时,才添加/test/
,anubhava的答案是一个好的解决方案
在您当前的版本(以及@anubhava的版本)中,[L,R=301]标志会导致重定向应用,因此新生成的url会再次提交。这就是为什么您必须注意不要重新应用此重定向
尽管如此,有一种更简单的方法,如果您真的不需要生成HTTP 301响应状态代码,它会很有用。然后从原始版本开始,您可以简单地:
- 在替换表达式中删除首字母“/”
- 删除“R=301”标志
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^subdomain.domain.com$
RewriteRule ^(.*)$ test/$1 [L]
这样,重定向只会发生一次:第二次,Apache将识别url没有更改,然后停止循环。这有点聪明。但是如果我在“test”文件夹中有一个名为“test”的文件夹,那么我无法使用该代码访问该文件夹-对吗?无法使用您的代码访问目标…对吗?您可以访问test内部的文件夹test,因为这只是在开始时检查
/test
,我在回答中也清楚地提到了这一点。这将导致Apache 500错误,因为looping@anubhava.在这种情况下,这不是一个内部重定向吗?@Zeth。我很困惑。你能公开相应的详细错误消息吗在日志中?@cFreed:不必感到困惑。内部重写不会停止循环。你需要一个RewriteCond
或负前瞻来防止它。@anubhava感谢你的确认。我相应地编辑了我的答案。