使用Apache mod_rewrite相关问题的子域到文件夹

时间:2011-08-10 21:58:43

标签: apache mod-rewrite subdomain subdirectory

我想将所有子域映射到文件夹 例如,subdomain.domain.com应显示domain.com/clients/subdmain(透明)的内容

RewriteCond %{HTTP_HOST} ^(.+)\.oomail\.org
RewriteCond %{HTTP_HOST} !^www\.oomail\.org [NC]
RewriteRule ^(.+)$ /var/www/clients/%1/$1

我收到500内部服务器错误。为了检查我附加[R]标志

的问题
RewriteRule ^(.+)$ /var/www/clients/%1/$1 [R]

我在地址栏中得到了这个结果

http://q1.oomail.org/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/var/www/clients/q1/always.html

然后我创建了一个详细转储$ _GET变量详细信息的details.php文件。它的内容是

<pre>
<?php
var_dump($_GET);
?>
</pre>

并将RewriteRule修改为(注意:我将$ 1和%1发送到details.php,显示其内容

RewriteRule ^(.+)$ details.php?p=%1&d=$1

打开http://subdomain.oomail.org/file.html后,输出为

array(2) {
  ["p"]=>
  string(9) "subdomain"
  ["d"]=>
  string(11) "details.php"
}

其中变量 p 是正确的(%1的值)是“子域”,但是 d (值为1美元)是我期待的details.php是我在网址中打开的 file.html 。我哪里错了?或者如何将file.html(URI)提取到变量中以进行映射?

1 个答案:

答案 0 :(得分:5)

使用此规则:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/clients/
RewriteCond %{HTTP_HOST} ^(.+)\.oomail\.org
RewriteCond %{HTTP_HOST} !^www\.oomail\.org
RewriteRule ^(.*)$ /clients/%1/$1 [L]

在你的第一次尝试中,你有无尽的重写循环,Apache必须中断(默认情况下不超过10次迭代)。在第二次尝试中,您将面临有限的重写循环(我相信2次迭代)。这就是mod_rewrite的工作原理,您应该在规则中考虑这种可能性 - 特别是当您使用.*作为匹配模式时。

我的规则中的第一个条件将阻止重写循环发生(意味着规则将仅在第一次迭代时起作用)。不幸的是,这意味着一些限制:原始网址不能/clients/开头。例如:此网址不会被重定向:http://something.example.com/clients/hello-kitten.php

解决方案 - clients文件夹重命名为更独特的内容:例如_clients_folder_(您必须在重写规则中更改该文件夹显然也是如此。

要阅读的内容:RewriteRule Last [L] flag not working?