0
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^(.*) http://www.%{HTTP_HOST}/$1 [R,NE]

RewriteCond %{HTTP_HOST} !^www\.domain\.com
RewriteCond %{REQUEST_URI} ^/([a-z0-9-_]+)\.php$
RewriteCond %{HTTP_HOST} ^www\.([a-z0-9-]+)\.domain\.com
RewriteRule ^(.+) http://www.domain.com/site.php?domain=%1&file=$1 [QSA]

首先,我已将所有裸子域和域重定向到它们自己的顶级域。这就是问题所在,我尝试将所有通配符子域名重写为主域的查询字符串,但它们是重定向而不是重写。

例如www.test.domain.com重定向到www.domain.com/site.php?domain=test&file=index.php而不是写它。

现在,如何修改此代码以使这些子域重写为主域的查询字符串?有可能的?也许它有一个预定的标志!或任何东西..还有其他改进建议吗?

4

1 回答 1

1

发生这种情况是因为当规则的目标以 开头时http://some-hostname/,重定向是隐式的,这意味着您不需要R标志来重定向,它会始终重定向。

现在,如何修改此代码以使这些子域重写为主域的查询字符串?有可能的?

这取决于,如果子域和主域的文档根目录完全相同,只需删除协议+主机名,因此:

RewriteRule ^(.+) http://www.example.com/site.php?domain=%1&file=$1 [QSA]

到:

RewriteRule ^(.+) /site.php?domain=%1&file=$1 [QSA]

但前提是子域和主域都在同一个地方。否则,您将不得不使用 mod_proxy 并使用P标志:

RewriteRule ^(.+) http://www.example.com/site.php?domain=%1&file=$1 [QSA,P,L]
于 2013-04-02T06:25:56.327 回答