【问题标题】:How do I use .htaccess to redirect to a URL containing HTTP_HOST?如何使用 .htaccess 重定向到包含 HTTP_HOST 的 URL?
【发布时间】:2010-09-09 12:05:44
【问题描述】:

问题

我需要将一些简短的便捷 URL 重定向到更长的实际 URL。相关网站使用一组子域来识别一组开发或实时版本。

我希望某些请求被重定向到的 URL 包含 HTTP_HOST,这样我就不必为每个主机创建自定义 .htaccess 文件。

主机特定示例(摘自 .htaccess 文件)

Redirect /terms http://support.dev01.example.com/articles/terms/

此示例适用于在 dev01.example.com 上运行的开发版本。如果我在 dev02.example.com 下运行的开发版本的主 .htaccess 文件中使用同一行,我最终会被重定向到错误的位置。

理想规则(不确定语法是否正确)

Redirect /terms http://support.{HTTP_HOST}/articles/terms/

这条规则不起作用,只是作为我想要实现的目标的一个例子。然后我可以在许多不同的主机下使用完全相同的规则并得到正确的结果。

答案?

  • 这可以通过 mod_alias 完成还是需要更复杂的 mod_rewrite?
  • 如何使用 mod_alias 或 mod_rewrite 来实现?如果可能,我更喜欢 mod_alias 解决方案。

澄清

我不在同一台服务器上。我愿意:

我希望能够在 example.com 和 dev.example.com 上的 .htaccess 文件中使用相同的规则。在这种情况下,我需要能够将 HTTP_HOST 作为变量引用,而不是在请求重定向到的 URL 中逐字指定它。

我将按照建议调查 HTTP_HOST 参数,但希望有一个可行的示例。

【问题讨论】:

    标签: .htaccess mod-rewrite mod-alias


    【解决方案1】:

    奇怪的是没有人做过真正的工作答案(笑):

    RewriteCond %{HTTP_HOST} support\.(([^\.]+))\.example\.com
    RewriteRule ^/terms http://support.%1/article/terms [NC,QSA,R]
    

    为了帮助您更快地完成工作,我最喜欢的检查正则表达式的工具:

    http://www.quanetic.com/Regex(别忘了选择 ereg(POSIX) 而不是 preg(PCRE)!)

    当您想检查 URL 并查看它们是否有效时,您可以使用此工具。

    【讨论】:

      【解决方案2】:

      如果我正确理解您的问题,您需要 301 重定向(告诉浏览器转到其他 URL)。 如果我的解决方案不适合您,请尝试以下工具:http://www.htaccessredirect.net/index.php 并找出适合您的解决方案。

      //301 Redirect Entire Directory
      RedirectMatch 301 /terms(.*) /articles/terms/$1
      
      //Change default directory page
      DirectoryIndex 
      

      【讨论】:

        【解决方案3】:

        我想你会想要捕获 HTTP_HOST 值,然后在重写规则中使用它:

        RewriteCond %{HTTP_HOST} (.*)
        RewriteRule ^/terms http://support.%1/article/terms [NC,R=302]
        

        【讨论】:

          【解决方案4】:

          听起来你真正需要的只是一个别名?

          Alias /terms /www/public/articles/terms/
          

          【讨论】:

          • 别名不是最理想的,因为它不执行重定向。这意味着您有两个没有规范 URI 的不同资源,这会导致各种问题 - 例如缓存效率低下、浏览器历史记录故障等
          【解决方案5】:

          您不需要包含此信息。只需提供一个相对于根的 URI。

          Redirect temp /terms /articles/terms/
          

          这在the mod_alias documentation中有解释:

          新的 URL 应该是一个以 scheme 和 hostname 开头的绝对 URL,但也可以使用以斜杠开头的 URL-path,在这种情况下,将添加当前服务器的 scheme 和 hostname。

          【讨论】:

            【解决方案6】:

            如果您停留在同一台服务器上,那么无论服务器如何,将其放入您的 .htaccess 中都会起作用:

            RedirectMatch 301 ^/terms$ /articles/terms/
            

            生产:

            http://example.com/terms -> http://example.com/articles/terms
            

            或:

            http://test.example.com/terms -> http://test.example.com/articles/terms
            

            显然,您需要调整 REGEX 匹配等,以确保它能够处理您要处理的内容。 301 也是如此,如果您不希望浏览器缓存重定向,则可能需要 302。

            如果你愿意:

            http://example.com/terms -> http://server02.example.com/articles/terms
            

            然后您需要使用 HTTP_HOST 参数。

            【讨论】:

              【解决方案7】:

              根据这个备忘单 (http://www.addedbytes.com/download/mod_rewrite-cheat-sheet-v2/png/) 这应该可以工作

              RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [NC]
              RewriteRule ^(.*)$ http://www.domain2.com/$1
              

              请注意,我没有办法对此进行测试,因此应将其视为正确方向的指针,而不是明确的答案。

              【讨论】:

              • 这假定重写的域将始终是 www.domain2.com。问题中明确指出并非如此。
              猜你喜欢
              • 1970-01-01
              • 2022-11-30
              • 2014-06-23
              • 1970-01-01
              • 1970-01-01
              • 2015-05-07
              • 2021-04-03
              • 2014-05-24
              • 1970-01-01
              相关资源
              最近更新 更多