使用IIS 6/7重写URL - 重写主机名{HTTP_HOST}

时间:2009-02-15 07:56:19

标签: asp.net iis

我需要为传入的请求重写“主机名”{HTTP_HOST}。是否可以使用IIS 7重写模块执行此操作? 我想将http://abc.xyz.com/ *重写为http://xyz.com/sites/abc/ *。这是针对在内部使用{HTTP_HOST}的SharePoint站点完成的。

是否有任何Url Rewriters可以让我更改IIS的{HTTP_HOST}变量?

亲切的问候,

6 个答案:

答案 0 :(得分:9)

您可以使用IIS 7 URL重写模块2.0来更改HTTP_HOST服务器变量。有关如何执行此操作的详细信息,请参阅Setting HTTP request headers and IIS server variables

答案 1 :(得分:3)

IIRF是免费的,允许您重写标头,包括HTTP_HOST。

  

我想将http://abc.xyz.com/ *重写为http://xyz.com/sites/abc/ *。这是针对在内部使用{HTTP_HOST}的SharePoint站点完成的。

您需要重写主机和Url。这使它有点复杂。在此规则集中,我按步骤执行,并使用新标头在步骤之间存储状态:

# detect whether we're using the abc host
RewriteCond     %{HTTP_HOST}          ^abc\.xyz\.com$
RewriteHeader   Host-Needs-Rewrite:   ^$                 YaHuh

# rewrite the Host: header to the alt host name if necessary
RewriteCond     %{HTTP_HOST_NEEDS_REWRITE}   ^YaHuh$
RewriteCond     %{HTTP_HOST}                 ^(?!xyz\.com)(.+)$
RewriteHeader   Host:          .*            xyz.com 

# rewrite the Url to the appropriate place
RewriteCond     %{HTTP_HOST_NEEDS_REWRITE}   ^YaHuh$
RewriteCond     %{HTTP_HOST}                 ^xyz\.com$
RewriteRule     /(.*)$                       /sites/abc/$1     [L]

你也可以使用通配符abc部分。像这样:

# detect whether we're using the abc host
RewriteCond     %{HTTP_HOST}          ^([^.]+)\.xyz\.com$
RewriteHeader   Host-Needs-Rewrite:   ^$                     %1

# rewrite the Host: header to the alt host name if necessary
RewriteCond     %{HTTP_HOST_NEEDS_REWRITE}   ^.+$
RewriteCond     %{HTTP_HOST}                 ^(?!xyz\.com)(.+)$
RewriteHeader   Host:          .*            xyz.com 

# rewrite the Url to the appropriate place
RewriteCond     %{HTTP_HOST_NEEDS_REWRITE}   ^(.+)$
RewriteCond     %{HTTP_HOST}                 ^xyz\.com$
RewriteRule     /(.*)$                       /sites/%1/$1     [L]

答案 2 :(得分:2)

我不熟悉IIS 7重写模块,但ISAPI_Rewrite可以更改您想要的任何HTTP标头。有一个免费版本,对我们的网站来说足够了,对你来说可能已经足够了。

答案 3 :(得分:2)

是的,可以使用IIS 7重写模块。您可以使用GUI根据this blog post在IIS7中设置重定向 您也可以按this SO answer使用命令行 在这两个示例中,您必须拥有一个单独的网站设置,其中包含自己的主目录以及与要重定向的域的绑定。我希望这是有道理的。

答案 4 :(得分:1)

如果您想避免重定向(根据您对Evgeny的评论),唯一的另一个选择是server.transfer。使用server.transfer,处理被发送到服务器上的不同页面,客户端不知道(页面之间没有往返客户端的回程)。

除了server.transfer,实际重定向是非常典型的ISAPI_Rewrite是一种流行的工具,并且正如Evgeny所提到的那样非常好。

答案 5 :(得分:0)

更新:这将执行重定向,而不是重置变量。我不会删除这个答案,因为我觉得它很整洁,但它并不能完全回答你的想法

我以非常简单的方式为Economist.com做到这一点

一个站点有两个IIS站点,它们共享同一个webroot。主IIS网站保持正在侦听当前主机标头,例如

216.35.68.215 economist.com

并且另一个IIS站点在输入其他主机头的IP地址上进行侦听。

即。

216.35.68.215 economist.co.uk

“主目录”中的第二个网络从属设备有一个重定向设置,可以更正人们到达您网站的主机名

设置“上面输入的确切网址”和“此资源的永久重定向” 并输入您的全限定主机名条目,如下所示

http://www.economist.com $ S $ Q

$ S $ Q将维护您输入的其他主机名上的所有网址。

随意测试

http://www.economist.co.uk/world/americas/

只会推动你

http://www.economist.com/world/americas/

这意味着您至少出于这个原因,不必运行相当昂贵的IIS重写模块