我在运行Apache的共享Web主机上有example1.com。它有一个目录example1.com/foo。我现在希望example2.com提供来自example1.com/foo的相同内容,但在example2.com root中没有URL中的介入目录。例如example2.com/bar.html应提供与example1.com/foo/bar.html相同的内容。
RewriteEngine on
RewriteCond %{HTTP_HOST} example2.com$ [NC]
RewriteRule ^(.*)$ foo/$1 [NC]
这个简单的重写规则接受针对example2.com的任何请求,并插入foo /指向该目录中的内容。问题是这一直在进行外部301重定向。我不希望这样,我希望浏览器保留在example2.com而不重定向,而Apache在文件系统中提供来自/ foo的内容。
已多次浏览Apache mod_rewrite docs,其中说明如何强制使用[R]标志进行301重定向,但不说如何强制它不发生。我在这里错过了什么?它在我的Linux共享主机和Windows上的Apache本地测试中的行为相同。
谢谢!
答案 0 :(得分:1)
我想出来了。 301正在发生,因为我在规则中有错误的目录名称。因此规则的结果指向了一条不存在的路径,这使得Apache尝试从文件系统重定向回退到301重定向。
然后我必须修复一个无限循环,因为上面的规则总是添加" foo"到URL即使它已经存在,所以我得到foo / foo / foo / foo / ....我们只有在它不存在的情况下才需要添加它。不得不用这个两步规则来做,因为你不能在负规则的捕获组中使用通配符。但这似乎有用,加上" foo"当主机是example2.com且URL尚未包含" foo"。
RewriteEngine on
RewriteCond %{HTTP_HOST} example2.com$ [NC]
RewriteRule !^foo - [C]
RewriteRule ^(.*)$ foo/$1 [NC,PT]