2017-06-19 105 views
2

我试图建立一个测试网站,但真正的麻烦让.htaccess重定向正确。.htaccess重定向URL但不包含子域的内容

我希望www.example.com/test的内容在用户输入test.example.com时显示。我的重写规则允许我在地址栏中使用test.example.com,但它实际上向我显示了根(www.example.com)的内容,而不是test子文件夹。

我不是.htaccess guru,但我一直在使用堆栈溢出5年,这是我第一次被困住足以问一个问题!你的集体智慧值得赞赏。

这里是我的.htaccess代码中的相关部分:

RewriteEngine On 

# Rewrite for http cases 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L] 

# Rewrite for no www cases 
RewriteCond %{HTTP_HOST} !www\.example\.com [NC] 

#redirect for test subdomain 
RewriteCond %{HTTP_HOST} !^test\.example\.com$ [NC] 
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L] 

# redirect to correct for old subfolder usage 
RewriteRule ^oldsubfolder/$ https://www.example.com/ [L,R=301] 

回答

1

我想要的www.example.com/test内容显示,当用户在test.site.com

我假设你只是有一个域和test.site.com真正应该test.example.com(这似乎是你的问题的其余部分保持一致)?

在你发布的代码中,没有什么是真的试图做这个重定向?在您发布的代码中,test.example.com的请求不会被重定向 - 所以如果是这样的话,您可能会看到缓存的响应。清除浏览器缓存。

你会需要这样的东西:

RewriteCond %{HTTP_HOST} ^(?:www\.)?(test)\.example\.com [NC] 
RewriteRule (.*) http://www.example.com/%1/$1 [R,L] 

(?:www\.)?部分简单地捕获了一个可选的子域www子域!根据创建子域的方式,可能可以访问test.example.comwww.test.example.com。 (虽然我怀疑你的SSL证书可能不允许这样呢?)

%1是一个反向引用捕获的组中的CondPattern(即test)和$1是一个反向引用捕获的RewriteRule模式。捕获子域(例如“测试”)只是避免重复,但也允许由同一规则处理多个子域。

这也是一个临时(302)重定向。只有当你确定它正在工作时才将它改为301(如果这是意图)。 301s被默认缓存,因此可能会使测试出现问题。

测试前清除浏览器缓存。


# Rewrite for no www cases 
RewriteCond %{HTTP_HOST} !www\.example\.com [NC] 

#redirect for test subdomain 
RewriteCond %{HTTP_HOST} !^test\.example\.com$ [NC] 
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L] 

在此块中间的评论似乎是误导性(它不“重定向测试子域”)。整个块只是重定向到www,不包括test子域。其他代码然后重定向子域。


UPDATE:

我希望它会继续在地址栏中

是的,这是可能的,以显示test.example.com。提供test.example.comwww.example.com指向相同的文件系统,然后您可以简单地重写请求,而不实际更改主机。对于这个例子,我假设test.example.comwww.example.com指向相同的文档根目录。

更改上述重定向以下重写

RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteCond %{HTTP_HOST} ^(?:www\.)?(test)\.example\.com [NC] 
RewriteRule (.*) /%1/$1 [L] 

请求现在停留在test.example.com和将服务内容从test.example.com/test(虽然这对用户是隐藏),因为test.example.comwww.example.com是真的是一回事。

REDIRECT_STATUS的检查确保我们只处理初始请求而不是重写的请求,从而避免了重写循环。 REDIRECT_STATUS在初始请求中为空,在第一次成功重写后设置为200

但是,如果test.example.com指向完全不同的地方,那么您需要实现反向代理并将请求“代理”到www.example.com以便将其从用户中“隐藏”。

+0

非常好!谢谢。我会试试这个。我认为代码可能不会重定向到子域,但是当我通过我的webhost创建子域时,我想它正在处理.htaccess之外的重定向。至少这是我以前做过的事情。 –

+0

这似乎工作。我希望它会继续在地址栏中显示test.example.com - 它现在只是将我引导到www.example.com/test - 但这不是什么大问题。有用!谢谢。 –

+0

是的,你仍然可以在地址栏中显示'test.example.com'。如果子域指向与主域相同的文件系统区域,则可以实现_internal rewrite_而不是_external redirect_。我已经更新了我的答案。 – MrWhite