我试图设置一个测试网站,但在让.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]
答案 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.com
和www.test.example.com
都可以访问。 (虽然我怀疑你的SSL证书可能不允许这样做吗?)
%1
是CondPattern
中被捕获群组的反向引用(即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.com
和www.example.com
指向同一个文件系统,您只需重写请求,而无需实际更改主机。对于此示例,我假设test.example.com
和www.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.com
和www.example.com
实际上是相同的。
对REDIRECT_STATUS
的检查确保我们只处理初始请求而不是重写请求,从而避免重写循环。 REDIRECT_STATUS
在初始请求中为空,并在第一次成功重写后设置为200
。
但是,如果test.example.com
指向完全不同的地方,那么您需要实施反向代理和&#34;代理&#34;请求www.example.com
以便隐藏&#34;来自用户。