Apache .htaccess重定向URL,但不重定向子域的内容
我正在尝试设置一个测试站点,但在使Apache .htaccess重定向URL,但不重定向子域的内容,apache,.htaccess,redirect,mod-rewrite,subdomain,Apache,.htaccess,Redirect,Mod Rewrite,Subdomain,我正在尝试设置一个测试站点,但在使.htaccess正确重定向时遇到了实际问题 我希望www.example.com/test的内容在用户在test.example.com中键入时显示出来。我的重写规则允许我在地址栏中使用test.example.com,但实际上它显示的是根目录(www.example.com)的内容,而不是test子文件夹 无论如何,我都不是.htaccess大师,但我已经使用堆栈溢出5年了,这是我第一次被难倒而提出问题!我们赞赏你的集体智慧 以下是我的.htaccess代码
.htaccess
正确重定向时遇到了实际问题
我希望www.example.com/test
的内容在用户在test.example.com中键入时显示出来。我的重写规则允许我在地址栏中使用test.example.com
,但实际上它显示的是根目录(www.example.com
)的内容,而不是test
子文件夹
无论如何,我都不是.htaccess
大师,但我已经使用堆栈溢出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]
我想让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
是对条件模式
(即测试
)中捕获的组的反向引用,$1
是对捕获的重写规则
模式的反向引用。捕获子域(例如“test”)只是避免重复,但也允许使用同一规则处理多个子域
这也是一个临时(302)重定向。只有当你确信它能工作时(如果你的意图是这样的话),才把它改成301。默认情况下会缓存301s,因此可能会导致测试出现问题
测试前清除浏览器缓存
<>这个块中间的注释似乎是误导性的(它不为测试子域重定向)。整个块只是重定向到www,不包括
test
子域。然后,另一个代码重定向子域
更新: 我希望它能继续在地址栏中显示test.example.com 是的,这是可能的。提供
test.example.com
和www.example.com
指向同一个文件系统,然后您可以简单地重写请求,而无需实际更改主机。对于本例,我将假设test.example.com
和www.example.com
指向同一文档根
将上述重定向更改为以下重写:
请求现在停留在test.example.com
上,并将提供test.example.com/test
中的内容(尽管这对用户是隐藏的),因为test.example.com
和www.example.com
实际上是一样的
对REDIRECT\u STATUS
的检查确保我们只处理初始请求而不是重写请求,从而避免了重写循环<代码>重定向\u状态在初始请求时为空,并在第一次成功重写后设置为200
但是,如果
test.example.com
指向完全不同的地方,则需要实现反向代理,并“代理”对www.example.com
的请求,以便对用户“隐藏”该请求 好极了!非常感谢。我来试试这个。我发现代码可能没有重定向到子域,但当我通过我的webhost创建子域时,我发现它正在处理.htaccess之外的重定向。至少我以前做的时候是这样的,看起来是这样的。我本来希望它能继续在地址栏上显示test.example.com,现在它只会把我引向www.example.com/test,但这没什么大不了的。它起作用了!谢谢。是的,您仍然可以在地址栏中显示test.example.com
。如果子域指向与主域相同的文件系统区域,则可以实现内部重写而不是外部重定向。我已经更新了我的答案。嘿!非常感谢。我花了几天时间才让它正常工作,但你的建议很到位。我的主机处理重定向的方式和.htaccess文件的设置方式之间存在一些奇怪的冲突。知道应该如何做以及可以做是一个巨大的帮助。
# 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]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} ^(?:www\.)?(test)\.example\.com [NC]
RewriteRule (.*) /%1/$1 [L]