Apache基于子域的重写

Posted

技术标签:

【中文标题】Apache基于子域的重写【英文标题】:Apache rewrite based on subdomain 【发布时间】:2010-09-08 03:34:18 【问题描述】:

我正在尝试将通配符域的请求重定向到子目录。 IE。 something.blah.example.com --> blah.example.com/something

我不知道如何获取子域名以在重写规则中使用。

最终解决方案:

RewriteCond %HTTP_HOST !^blah\.example\.com
RewriteCond %HTTP_HOST ^([^.]+)
RewriteRule ^(.*) /%1/$1 [L]

或者正如 pilif 指出的那样

RewriteCond %HTTP_HOST ^([^.]+)\.blah\.example\.com$

【问题讨论】:

【参考方案1】:

您应该查看 apache 文档中的 URL Rewriting Guide。

以下内容未经测试,但应该是诀窍:

RewriteCond %HTTP_HOST ^([^.]+)\.blah\.domain\.com$
RewriteRule ^/(.*)$           http://blah.domain.com/%1/$1 [L,R] 

这仅适用于子域不包含点的情况。否则,您必须更改 RewriteCond 中的 Regexp 以匹配由于锚定而仍应工作的任何字符,但这肯定感觉更安全。

【讨论】:

注意“何时不使用 Rewrite”:httpd.apache.org/docs/2.2/rewrite/avoid.html#redirect【参考方案2】:

试试这个:

RewriteCond %HTTP_HOST (.+)\.blah\.domain\.com
RewriteRule ^(.+)$ /%1/$1 [L]

@pilif(见评论):好的,那是真的。我刚刚复制了一个在我的一个项目中使用的 .htaccess。猜猜它的方法略有不同:)

【讨论】:

您的解决方案不会重定向到 blah.domain.com,而只是重写为 something.blah.domain.com/something,这不是我阅读原始问题的方式。 我想如果它们都由同一个 VirtualHost 服务就可以了。特别是,这样做意味着客户端看不到重定向 - 他们仍然看到 something.blah.example.com。【参考方案3】:

@山姆

您的 RewriteCond 行是错误的。变量的扩展是用 % 触发的,而不是 $。

RewriteCond %HTTP_HOST ^([^\.]+)\.media\.xnet\.tk$
            ^

这应该可以解决问题

【讨论】:

哈!一个字符的错字再次出现:(

以上是关于Apache基于子域的重写的主要内容,如果未能解决你的问题,请参考以下文章

带有通配符子域的 Apache SSL 重写

apache中的vhost重写规则-摆脱子域而不重定向

使用基于浏览器语言的 htaccess 从和到子域重定向

Apache 重写:如何避免在省略 url 结尾斜杠时显示 url 参数?

IIS7中的通配符子域。是否有可能使它们像在Apache中一样?

Apache中 RewriteRule 规则参数介绍