将通配符子域重定向到子目录,而不更改地址栏中的 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的主要内容,如果未能解决你的问题,请参考以下文章

htaccess通配符子域重定向与https非www

如何将所有 https 请求重定向到 https

将所有通配符子域重定向到根域

如何将通配符子域重定向到我的域

带有通配符子域的 Apache SSL 重写

Nginx 将子域转换为路径组件而不进行重定向