在IIS URL Rewrite模块中自定义HTTP头

6

我被一个简单的出站规则困住了,我想修改HTTP的Content-Typeapplication/atom+xml,如果URL完全匹配http://wayneye.com/Feeds/Atom

我的规则XML:

<outboundRules>
<rule name="AtomFeedsIMEType" patternSyntax="ExactMatch">
    <match serverVariable="RESPONSE_CONTENT_TYPE" pattern="http://{HTTP_HOST}/Feeds/Atom" />
    <action type="Rewrite" value="application/atom+xml" />
</rule>

需要帮助...

1个回答

8

您正在将服务器变量与完整的URL(包括域名)进行匹配。那不会起作用;-)。无论Content-Type的值是什么,您都将替换它,因此可以将其与任何内容进行匹配。为了确保您不在每个页面上都替换它,您需要添加一个前提条件,仅匹配以/Feeds/Atom(在{REQUEST_URI}上)开头的请求。这是一个例子:

<outboundRules>
  <rule name="AtomFeedsIMEType" preCondition="Match atom feeds">
    <match serverVariable="RESPONSE_Content_Type" pattern="(.*)" negate="false" />
    <action type="Rewrite" value="application/atom+xml" replace="true" />
  </rule>
  <preConditions>
    <preCondition name="Match atom feeds">
      <add input="{REQUEST_URI}" pattern="^/Feeds/Atom" />
    </preCondition>
  </preConditions>
</outboundRules>

为了使这个功能正常工作,服务器必须设置允许更改Content-Type头。这可以在服务器级别或站点级别完成,但需要管理员完成。它设置在applicationHost.config中,而不是web.config中。以下是允许此项操作的applicationHost.config的一部分内容:
<location path="your_site_name">
  <system.webServer>
    <rewrite>
      <allowedServerVariables>
        <add name="CONTENT_TYPE" />
      </allowedServerVariables>
    </rewrite>
  </system.webServer>
</location>

您还可以通过 GUI,在主 URLRewrite 屏幕下的“查看服务器变量”链接下允许此操作。希望这可以帮助您。

然而,我仍然遇到问题!根据http://learn.iis.net/page.aspx/570/application-request-routing-version-2-overview/,HTTP_CONTENT_TYPE已更改为RESPONSE_CONTENT_TYPE,无论我使用哪个,它都不起作用(即内容类型不会更改)!实际上,我的开发环境请求URI是:http://localhost/WayneBlog.Web/Feeds/Atom,模式“^ / Feeds / Atom”是否正确?请指导。 - Wayne Ye
是的,你需要使用RESPONSE_CONTENT_TYPE来替换Content-Type HTTP头,这是我在例子中所做的。如果你的请求URI不同,你需要改变前提条件的模式。例如,pattern="ˆ/WayneBlog.Web/Feeds/Atom" 或者如果你想要在开发和生产环境之间实现兼容性,你可以使用: pattern="/Feeds/Atom$" 来匹配任何以/Feed/Atom结尾的URL。 - Marco Miltenburg
谢谢,我使用了Feeds/Atom并解决了问题 :) - Wayne Ye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接