【问题标题】:Redirect wildcard subdomains to subdirectory, without changing URL in address bar将通配符子域重定向到子目录,而不更改地址栏中的 URL
【发布时间】: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,我收到重定向循环错误。

如果有人能指出我正确的方向,我将不胜感激!我所做的任何更改似乎都不起作用...

【问题讨论】:

    标签: apache .htaccess mod-rewrite redirect subdomain


    【解决方案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 等!
      猜你喜欢
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 2014-01-17
      • 2013-09-20
      • 2015-06-22
      • 1970-01-01
      • 2017-09-17
      • 2017-02-02
      相关资源
      最近更新 更多