我在这里读了很多关于这个的问题和答案,但没有一个能够解决我的具体问题。
我想将任何子域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]
但是,这使我到一个网站redirect循环,在一个不正确的地址在子网域仍然存在的URL栏中。
例如,x.domain.com带我到x.domain.com/x,我得到一个redirect循环错误。
如果有人能把我指向正确的方向,我将不胜感激。 没有什么我改变似乎工作…
首先,确保apache配置中的虚拟主机配置正确,并且domain.com的所有子域位于相同的主机配置(通配符)中:
<VirtualHost *:80> serverName domain.com serverAlias *.domain.com ...
您可以使用以下htaccess配置获取重定向:
RewriteEngine on RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com RewriteRule ^(.*)$ http://domain.com/%1/$1 [L,NC,QSA]
现在,如果您打开asd.domain.com,它应该将您重定向到domain.com/asd。 您仍然会遇到问题,即重定向在URL地址栏中可见。 为了防止这种情况,请在您的服务器上启用mod_proxy(并加载子模块),并用“P”标志交换“L”标志:
RewriteEngine on RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com RewriteRule ^(.*)$ http://domain.com/%1/$1 [P,NC,QSA]
如果这不起作用,查看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
如果你的服务器被配置为允许通配符子域,那么这个可以在.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]
我将$_SERVER['DOCUMENT_ROOT']
下的子目录命名为子域名,如下所示:
/ var/ www/ html/ .htaccess subdomain1.domain.com/ subdomain2.domain.com/ subdomain3.domain.com/
/var/www/html
表示'DOCUMENT_ROOT'
。 然后将以下代码放在.htaccess
文件中:
RewriteEngine on RewriteCond %{REQUEST_URI} !^/%{HTTP_HOST}/ RewriteRule (.*) /%{HTTP_HOST}/$1 [L]
它作为重定向通配符子域名到子目录,不改变地址栏中的URL。
除了虚拟主机之外 ,您还可以将子目录放在根目录之外,并按照此处所述使用别名访问它。 然后把相同的.htaccess
代码放在那个位置。