IIS 重写不起作用(但重定向起作用)
Posted
技术标签:
【中文标题】IIS 重写不起作用(但重定向起作用)【英文标题】:IIS Rewrite not working (but redirection does) 【发布时间】:2013-02-27 18:09:05 【问题描述】:我曾尝试使用 Rewrite Module 2.0 进行 URL 重写,但我没有让它工作。我正在尝试做的是将端口 80 对 Web 应用程序的所有调用重新写入 IIS 中托管的其他应用程序(或者可能在网络上的不同服务器上)。使用 IIS 提供的 GUI,我创建了以下规则:
<rewrite>
<rules>
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="site1/(.*)" />
<action type="Rewrite" url="http://localhost:7001/R:1" />
</rule>
</rules>
</rewrite>
安静简单,但不幸的是它不起作用。另一方面,当我将操作类型更改为Redirect
时,它工作正常。
可能是什么问题?
【问题讨论】:
你能定义“不工作”吗?我的意思是,实际发生了什么? 你在使用Application Request Routing吗?作为测试,如果将type="Rewrite"
更改为type="Redirect"
会怎样?
@cheesemacfly 是的,我正在使用应用程序请求路由。当我将其更改为Redirect
时,它确实有效并将我重定向到目标网址。但是当使用Rewrite
时出现404 错误。
你已经在应用请求路由上启用了代理模式?
@cheesemacfly:是的,我当然做到了。
【参考方案1】:
我昨天遇到了同样的问题,我花了很长时间才弄清楚。
这里的关键是你的重写操作中有一个http://
前缀;这使得这是一个需要由应用程序请求路由处理的特殊情况。第一步是确保安装了应用程序请求路由模块。您可以在https://www.iis.net/downloads/microsoft/application-request-routing 找到该模块。安装后,转到您的 IIS Web 服务器(从您的网站升级),然后打开“应用程序请求路由缓存”功能。从右侧的操作中,选择Server.Proxy.Settings
,并确保选中“启用代理”复选框。这允许将 URL 重写任务重新路由到应用程序请求路由,并且您的反向代理应该适用于外部请求。
这个想法来自 2009 年这篇出色的博客文章:http://ruslany.net/2009/04/10-url-rewriting-tips-and-tricks/
【讨论】:
这是我遇到的问题。当我使用 url rewrite 重写到其他域时,它解决了我的问题 这个解决方案也解决了我的问题。我正在重写一个完全不同的域名。 你成就了我的一天(昨天我在那个问题上输了一个完整的)!【参考方案2】:当我试图解决同样的问题时,偶然发现了这篇旧帖子。
解决了!
使用 IIS 服务管理器中的重写 URL 功能,我创建了一个友好的 URL 规则。
这没问题,当我查看 web.config 文件(www 根目录)中的规则时,它显示了 1 条重定向规则和 1 条重写规则。
我对此进行了编辑以适应 1 场比赛。然后我只是复制了这段代码,为每个代码编辑了产品 ID。示例如下:
<rule name="RedirectUserFriendlyURL1" stopProcessing="true">
<match url="^product\.php$" />
<conditions>
<add input="REQUEST_METHOD" pattern="^POST$" negate="true" />
<add input="QUERY_STRING" pattern="^id_product=\b35\b" />
</conditions>
<action type="Redirect" url="990mm-bohemia-cast-iron-electric-radiator"
appendQueryString="false" />
</rule>
第一条规则在 URL 中查找字符串 "product.php"
和 "id_product=35"
,然后重定向到当前不存在的 "990mm-bohemia-cast-iron-electric-radiator"
。然后(见下文)
<rule name="RewriteUserFriendlyURL1" stopProcessing="true">
<match url="^\b990mm-bohemia-cast-iron-electric-radiator\b" />
<conditions>
<add input="REQUEST_FILENAME" matchType="IsFile" negate="true" />
<add input="REQUEST_FILENAME" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="product.php?id_product=35" />
</rule>
此规则将"product.php?id_product=35"
位重写为“990mm-bohemia-cast-iron-electric-radiator”,从而为重定向创建新位置。
【讨论】:
【参考方案3】:请确保 MVC 路由不会窃取您的请求。为防止这种情况发生,请忽略您尝试重写的路线:
RouteTable.Routes.Ignore("blog/*pathInfo");
灵感来自:https://sitecore.stackexchange.com/questions/3645/how-to-setup-a-reverse-proxy-with-sitecore
【讨论】:
【参考方案4】:将重写 URL 更改为 AbsolutePath,而不是输入 http://... 应该是
<action type="Rewrite" url="R:1" />
它对我有用,但就我而言,我已被重写为固定网页。
【讨论】:
应该是什么?以上是关于IIS 重写不起作用(但重定向起作用)的主要内容,如果未能解决你的问题,请参考以下文章