Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache .htaccess重定向URL,但不重定向子域的内容_Apache_.htaccess_Redirect_Mod Rewrite_Subdomain - Fatal编程技术网

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]