mod_rewrite是重定向而不是重写

时间:2011-07-04 12:59:09

标签: url mod-rewrite apache2 subdomain

我必须遗漏一些明显的东西,但我无法使其发挥作用

我想拥有包含子域名的精美网址,但我想从文件中读取子域名的内容而不是某些目录:

RewriteEngine On
RewriteBase /
Options +FollowSymlinks
RewriteCond %{HTTP_HOST} ^subdomain.example.com
RewriteRule (.*) http://example.com/subdomain.php

这些规则有效,但如果我输入subdomain.example.com,我重定向到example.com/subdomain.php - 但我不想要这个,我只想在内部重写网址。 ..

非常感谢!我试过[QSA,L],不行。

2 个答案:

答案 0 :(得分:3)

如果你替换它:

RewriteRule (.*) http://example.com/subdomain.php

有了这个,我怀疑它会像你期望的那样工作:

RewriteRule (.*) subdomain.php

除非您确实想要重定向到另一个域,否则无需重写域,您只需要重写请求以指向相应的文件。确实,当您发现重写域时将导致重定向。通常,RewriteRule匹配域之后的所有请求,因此只匹配路径和查询。

答案 1 :(得分:1)

如果您可以访问域的DNS控件,而不是使用mod重写,则可以使用指向同一本地目录的通配符('%'或'*')设置一个catchall子域。在那里,你可以有一个PHP脚本,所有请求都指向使用:

Options +FollowSymlinks
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ /index.php?p=$1 [L]

这会将所有请求运行到该PHP文件中。在那里,您可以检查所请求域的$ _SERVER变量,以及检查子域的检查器。在那里它可以使用诸如file_get_contents()子例程之类的东西将相关数据转发到客户端,并且如果发出的请求可能有效,则有404或403报头响应,但不能到该子域。

希望有道理......