mvc 4 url​​ rewrite给我一个404.4,即使重写看起来不错

时间:2012-12-03 06:11:06

标签: url-rewriting asp.net-mvc-4 iis-express

我正在尝试将网址重写以更改

等请求

http://foo.bar.com/

http://bar.com/foo/

我已将我的网址重写规则添加到网页配置中,如此

<rewrite>
  <rules>
      <rule name="SiteReWrite" stopProcessing="true">
          <match url="(.*)" />
          <action type="Rewrite" url="http://bar.com/{C:1}/"/>
          <conditions>
              <add input="{HTTP_HOST}" pattern="(.*)\.bar\.com" />
          </conditions>
      </rule>
  </rules>
</rewrite>

但我收到404.4错误。查看跟踪日志文件,我在那里看到了

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
 <System>
  <Provider Name="WWW Server" Guid="{3A2A4E84-4C21-4981-AE10-3FDA0D9B0F83}"/>
  <EventID>0</EventID>
  <Version>1</Version>
  <Level>4</Level>
  <Opcode>42</Opcode>
  <Keywords>0x0</Keywords>
  <TimeCreated SystemTime="2012-12-03T05:54:01.237Z"/>
  <Correlation ActivityID="{00000000-0000-0000-1000-0080030000FC}"/>
  <Execution ProcessID="7312" ThreadID="3180"/>
  <Computer>ULTRA</Computer>
 </System>
 <EventData>
  <Data Name="ContextId">{00000000-0000-0000-1000-0080030000FC}</Data>
  <Data Name="OldUrl">/</Data>
  <Data Name="NewUrl">http://bar.com/foo/</Data>
 </EventData>
 <RenderingInfo Culture="en-US">
  <Opcode>URL_CHANGED</Opcode>
 </RenderingInfo>
 <ExtendedTracingInfo xmlns="http://schemas.microsoft.com/win/2004/08/events/trace">
  <EventGuid>{D42CF7EF-DE92-473E-8B6C-621EA663113A}</EventGuid>
 </ExtendedTracingInfo>
</Event>

NewUrl看起来像是桃子。注意,看起来此实例已缓存,但我之前在事件中看到规则匹配。

如果我输入网址http://bar.com/foo/,它就会正常工作。 我不希望用户看到新的网址,他们应该认为他们在foo.bar.com而不是bar.com/foo。这只是我在mvc应用程序中的一些路由。

有没有人知道为什么它会做这种奇怪的行为?我正在使用IIS express 8,我还没有尝试使用IIS。

2 个答案:

答案 0 :(得分:0)

您应该redirect而不是rewrite

<rewrite>
  <rules>
      <rule name="SiteReWrite" stopProcessing="true">
          <match url="(.*)" />
          <action type="Redirect" url="http://bar.com/{C:1}/"/>
          <conditions>
              <add input="{HTTP_HOST}" pattern="(.*)\.bar\.com" />
          </conditions>
      </rule>
  </rules>
</rewrite>

如果您真的想要重写,则必须通过安装ARR(应用程序请求路由)模块将IIS设置为反向代理。

答案 1 :(得分:0)

由于我不希望用户看到网址更改,因此我无法使用重定向。但是,我应该提到的是,所有子域都将转到同一个站点。有一次我想到了它,并且在重写模块上读了一点,我修改了像这样的MSDN示例;这就像一个魅力

<rewrite>
  <rules>
    <rule name="Rewrite subdomain">
      <match url="(.*)" /> <!-- rule back-reference is captured here -->
      <conditions>
        <add input="{HTTP_HOST}" pattern="^([^.]+)\.bar\.com$" /> <!-- condition back-reference is captured here -->
      </conditions>
      <action type="Rewrite" url="{C:1}/{R:1}" /> <!-- rewrite action uses back-references to condition and to rule when rewriting the url -->
    </rule> 
  </rules>
</rewrite>