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

Posted

技术标签:

【中文标题】使用 Apache mod_rewrite 相关问题的子域到文件夹【英文标题】:Subdomain to Folder using Apache mod_rewrite related Problem 【发布时间】:2011-10-24 12:09:42 【问题描述】:

我想将我的所有子域映射到文件夹。 例如 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是我在 URL 中打开的 file.html 。我哪里错了?或如何将 file.html (URI) 提取到变量中进行映射?

【问题讨论】:

【参考方案1】:

使用这条规则:

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 的工作原理,您应该在规则中计算这种可能性——尤其是当您使用 .* 作为匹配模式时。

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

解决方案 -- clients 文件夹重命名为更独特的名称: 例如 _clients_folder_(显然,您还必须在重写规则中更改该文件夹)。

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

【讨论】:

以上是关于使用 Apache mod_rewrite 相关问题的子域到文件夹的主要内容,如果未能解决你的问题,请参考以下文章

Apache2 - 使用 mod_rewrite 代理到另一个域

如果 .htaccess 使用 mod_rewrite,则 Apache httpd.conf mod_rewrite 取消

Apache - 添加虚拟目录后无法再使用 mod_rewrite

Apache mod_rewrite 和多个域

CodeIgniter 删除 index.php apache mod_rewrite

Apache 2.4 不使用适用于 2.2 的规则通过 mod_rewrite 进行代理