将通配符子域重定向到子目录,而不更改地址栏中的URL

New*_*nab 3 apache subdomain .htaccess mod-rewrite redirect

我在这里已经阅读了很多关于这方面的问题和答案,但似乎没有解决我的具体问题.

我想将任何子域重定向到子目录以匹配.

所以:x.domain.com将转到domain.com/x,而y.domain.com将转到domain.com/y - 但我希望这样做,而地址栏中的URL不会更改.

这是我到目前为止所拥有的:

    Options +FollowSymLinks 

    RewriteEngine on

    RewriteBase /

    RewriteCond %{HTTP_HOST} !^(www)\. [NC]

    RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com [NC]

    RewriteRule ^ /%1 [P,L]
Run Code Online (Sandbox Code Playgroud)

但这会将我带到一个网站重定向循环,在子域仍然存在的URL栏中有一个不正确的地址.

例如,x.domain.com将我带到x.domain.com/x,我收到重定向循环错误.

如果有人能指出我正确的方向,我将不胜感激!我没有改变似乎工作......

小智 8

首先,确保正确配置了apache配置中的vhost,并且domain.com的所有子域都在同一主机配置(通配符)中:

<VirtualHost *:80>
ServerName domain.com
ServerAlias *.domain.com
...
Run Code Online (Sandbox Code Playgroud)

您可以使用以下htaccess配置进行重定向:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com
RewriteRule ^(.*)$ http://domain.com/%1/$1 [L,NC,QSA]
Run Code Online (Sandbox Code Playgroud)

现在,如果您打开asd.domain.com,它应该将您重定向到domain.com/asd.您仍然会遇到问题,重定向在URL地址栏中可见.为了防止这种情况,请在服务器上启用mod_proxy(并加载子模块),并将"L"标志与"P"标志交换:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com
RewriteRule ^(.*)$ http://domain.com/%1/$1 [P,NC,QSA]
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,在子域调用上查看vhost配置和error.log的内容将会很有帮助!

参考文献:
.htaccess重写子域到目录
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_p


Dan*_*ray 7

这可以在.htaccess没有mod_proxy提供服务器配置为允许通配符子域的情况下实现.(我通过创建手动命名的子域在JustHost中实现了这一点*).将其添加到您的.htaccess文件中:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.website\.com$
RewriteCond %{HTTP_HOST} ^(\w+)\.website\.com$
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]
Run Code Online (Sandbox Code Playgroud)