如何使用 .htaccess 重定向到包含 HTTP_HOST 的 URL?
-
09-06-2019 - |
题
问题
我需要将一些短的方便 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 解决方案。
澄清
我不会呆在同一个服务器上。我想要:
- http://example.com/条款/ -> http://支持.example.com/文章/条款/
- https://安全.example.com/条款/ -> http://支持.example.com/文章/条款/
- http://dev.example.com/条款/ -> http://支持.dev.example.com/文章/条款/
- https://安全.dev.example.com/条款/ -> http://支持.dev.example.com/文章/条款/
我希望能够在 example.com 和 dev.example.com 上的 .htaccess 文件中使用相同的规则。在这种情况下,我需要能够将 HTTP_HOST 作为变量引用,而不是在请求重定向到的 URL 中逐字指定它。
我将按照建议调查 HTTP_HOST 参数,但希望有一个可行的示例。
解决方案
奇怪的是没有人真正做过 在职的 回答(笑):
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 并查看它们是否有效时,可以使用此工具。
其他提示
我认为您需要捕获 HTTP_HOST 值,然后在重写规则中使用它:
RewriteCond %{HTTP_HOST} (.*)
RewriteRule ^/terms http://support.%1/article/terms [NC,R=302]
如果我理解你的问题,你需要 301 重定向(告诉浏览器转到其他 URL)。如果我的解决方案不适合您,请尝试使用此工具: http://www.htaccessredirect.net/index.php 并弄清楚什么对你有用。
//301 Redirect Entire Directory
RedirectMatch 301 /terms(.*) /articles/terms/$1
//Change default directory page
DirectoryIndex
根据这个备忘单( http://www.addedbytes.com/download/mod_rewrite-cheat-sheet-v2/png/ )这应该有效
RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain2.com/$1
请注意,我没有办法测试这一点,因此这应该被视为正确方向的指针,而不是明确的答案。
如果您位于同一服务器上,那么无论服务器如何,将其放入 .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 参数。
您不需要包含此信息。只需提供相对于根的 URI。
Redirect temp /terms /articles/terms/
这在中进行了解释 mod_alias 文档:
新的 URL 应该是以方案和主机名开头的绝对 URL,但也可以使用以斜杠开头的 URL 路径,在这种情况下,将添加当前服务器的方案和主机名。
听起来您真正需要的只是一个别名?
Alias /terms /www/public/articles/terms/