【问题标题】:.htaccess redirecting URL but not content for subdomain.htaccess 重定向 URL 但不是子域的内容
【发布时间】:2017-11-22 07:02:46
【问题描述】:

我正在尝试建立一个测试站点,但在让.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]

【问题讨论】:

    标签: apache .htaccess redirect mod-rewrite subdomain


    【解决方案1】:

    我希望在用户输入test.site.com 时显示www.example.com/test 的内容。

    我假设您只有一个域,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 的反向引用模式。捕获子域(例如“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 指向同一个文件系统,那么您可以简单地rewrite 请求而无需实际更改主机。对于这个例子,我假设test.example.comwww.example.com 指向同一个文档根目录。

    把上面的redirect改成下面的rewrite

    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,以便对用户“隐藏”它。

    【讨论】:

    • 太棒了!谢谢你。我会试试这个。我认为代码可能不会重定向到子域,但是当我通过我的网络主机创建子域时,我认为它正在处理 .htaccess 之外的重定向。至少我之前做的时候是这样的。
    • 这似乎奏效了。我希望它会继续在地址栏中显示 test.example.com - 它现在只是将我定向到 www.example.com/test - 但这没什么大不了的。有用!谢谢。
    • 是的,您仍然可以在地址栏中显示test.example.com。如果子域与主域指向文件系统的同一区域,那么您可以实现 internal rewrite 而不是 external redirect。我已经更新了我的答案。
    • 嘿!非常感谢。我花了几天时间才让它正常工作,但你的建议是正确的。我的主机处理重定向的方式与我的 .htaccess 文件的设置方式之间存在一些奇怪的冲突。知道应该如何完成以及可以完成是一个巨大的帮助。
    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2013-05-28
    • 2012-06-24
    • 2022-09-30
    • 1970-01-01
    相关资源
    最近更新 更多