Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式无限循环_Regex_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Regex 正则表达式无限循环

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 但我很难做到这一点

我有一个指向两个域名的服务器。因此,在我的.htaccess文件中,我想制定一个简单的规则,说明以下内容:

如果您来自test.domain.com,则转到文件夹X,如果您来自-other-sub.domain.com,则转到文件夹Y。这意味着我正在移动其中一个子域,因此我可以使其重定向到正确的URL(如果人们正在跟踪深层链接。例如,如果人们转到
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感谢你的确认。我相应地编辑了我的答案。