.htaccess重定向URL但不是子域的内容

时间:2017-06-19 22:51:56

标签: apache .htaccess redirect mod-rewrite subdomain

我试图设置一个测试网站,但在让.htaccess正确重定向方面遇到了麻烦。

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

我在任何方面都不是.htaccess大师,但是我已经使用Stack Overflow 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 个答案:

答案 0 :(得分: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证书可能不允许这样做吗?)

%1CondPattern中被捕获群组的反向引用(即test),$1是对已捕获的RewriteRule 图案。捕获子域(例如" test")只是避免重复,但也允许同一规则处理多个子域。

这也是一个临时(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子域。然后其他代码重定向子域。

<强>更新

  

我希望它能继续在地址栏中显示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指向完全不同的地方,那么您需要实施反向代理和&#34;代理&#34;请求www.example.com以便隐藏&#34;来自用户。