将通配符子域重定向到子目录,而不更改地址栏中的 URL
Posted
技术标签:
【中文标题】将通配符子域重定向到子目录,而不更改地址栏中的 URL【英文标题】:Redirect wildcard subdomains to subdirectory, without changing URL in address bar 【发布时间】:2013-05-21 10:14:08 【问题描述】:我在这里阅读了很多关于此的问题和答案,但似乎没有一个可以解决我的具体问题。
我想将任何子域重定向到要匹配的子目录。
所以: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]
但这会将我带到一个网站重定向循环,在 URL 栏中的地址不正确,子域仍然存在。
例如,x.domain.com 将我带到 x.domain.com/x,我收到重定向循环错误。
如果有人能指出我正确的方向,我将不胜感激!我所做的任何更改似乎都不起作用...
【问题讨论】:
【参考方案1】:如果您的服务器配置为允许通配符子域,则可以在没有mod_proxy
的情况下在.htaccess
中实现这一点。 (我在 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]
【讨论】:
你能帮帮我吗?我想将 john.website.com 重定向到 app.website.com/sort.php,同时将 john.website.com 保留在地址栏中【参考方案2】:我将$_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]
它可以将 wildcard 子域重定向到子目录,而无需更改地址栏中的 URL。
除了vhost,您还可以将子目录放在根目录之外并使用别名 访问它,如here 所述。然后将相同的.htaccess
代码放在该位置。
【讨论】:
【参考方案3】:首先,确保apache配置中的vhost配置正确,并且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(并加载子模块)并将“L”标志与“P”标志交换:
RewriteEngine on
RewriteCond %HTTP_HOST ^(.*)\.domain\.com
RewriteRule ^(.*)$ http://domain.com/%1/$1 [P,NC,QSA]
如果这不起作用,查看 vhost 配置和子域调用的 error.log 内容会有所帮助!
参考:.htaccess rewrite subdomain to directory http://httpd.apache.org/docs/2.2/mod/mod_proxy.html http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_p
【讨论】:
我试过这个,但我遇到了一些错误... [Sun May 26 13:02:28 2013] [error] [client 2.126.187.186] Attempt to serve directory: proxy:@ 987654324@ [Sun May 26 13:02:29 2013] [error] [client 2.126.187.186] 文件不存在:代理:domain.com/x/favicon.ico 当我访问 URL x.domain.com 时,我得到一个 404,它表示:在此服务器上找不到请求的 URL /。 之前,当你有标志“L”而不是“P”时,它是否有效?当 mod_proxy 未启用时,我通常会收到消息“尝试服务目录:proxy:domain.com/x”!为了确定,您将“domain.com”替换为您的真实域名? 啊哈! Mod_proxy 没有启用,就是这样!我用谷歌搜索了一些关于如何启用它的答案,现在它似乎正在工作!谢谢!我会勾选这个。 啊,等一下!现在我在 www.domain.com 上得到一个重定向循环,它试图去 www.domain.com/www/www/www/www 等!以上是关于将通配符子域重定向到子目录,而不更改地址栏中的 URL的主要内容,如果未能解决你的问题,请参考以下文章