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

标签 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

然后我创建了一个details.php 文件,该文件转储$_GET 变量详细信息。其内容为

<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) 提取到变量中进行映射?

最佳答案

使用此规则:

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

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

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

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

要读的东西:RewriteRule Last [L] flag not working?

关于apache - 使用 Apache mod_rewrite 相关问题到文件夹的子域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7018387/

相关文章:

apache - Htaccess 重定向 - 将许多规则合并到一个重定向中

regex - mod重写url中的路径

azure - 如何在azure中创建自定义通配符域

dns - 将 mail.example.com 重定向到 http ://mail. google.com/a/example.com

apache - 使用 EC2/Route53 设置子域 VHost

PHP 写入文件 - 权限被拒绝

django - 在 apache 上设置 django(mod_wsgi、virtualenv)

json - 如何根据http-header内容类型进行mod_rewrite

macos - 如何重写 httpd-vhosts.conf 以允许 SSL 连接到私有(private) Web 服务器?

redirect - 使用 Apache 2.x 和 Tomcat 6.x 将子域映射到 Servlet 上下文