我有这个服务器,其中两个域名是指向。 所以在我的.htaccess文件中,我想制定一个简单的规则来说明一些事情:
如果你来自test.domain.com,然后进入文件夹X,如果你来自other-sub.domain.com,那么去到文件夹Y.这意味着我正在移动其中一个子域,所以我可以就像这样它redirect到正确的URL(如果人们正在深入链接,例如,如果人们去http://test.domain.com/path/to/a/page
,他们将被redirect到/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/test/test/test/abc
,然后抱怨我有无尽的循环。 请不要在Apache的mod_rewrite.c文档中提供智能链接…我已经读过了,这是它带我的地方。 我知道*表示“匹配0次或更多次”,但我不明白为什么复制目标string一遍又一遍…? /test/
不是正则expression式中的variables,是吗? 那为什么要重复呢?
如果您无条件地重定向到/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响应状态代码,那么这个方法很有用。
然后从你的原始版本,你可以简单地:
所以你的版本变成:
Options +FollowSymLinks RewriteEngine on RewriteBase / RewriteCond %{HTTP_HOST} ^subdomain.domain.com$ RewriteRule ^(.*)$ test/$1 [L]
这样,重定向只会发生一次:第二次,Apache会认识到url没有改变,然后停止循环。