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 重写不起作用(但重定向起作用)的主要内容,如果未能解决你的问题,请参考以下文章

部署到 IIS 后自定义授权属性不起作用

HTTPS 重定向到一个不起作用的文件夹

自动 IIS6 403.4 重定向到 SSL 不起作用

重写规则不起作用 - 返回目录列表而不是重定向

从 http 到 https 的重定向不起作用

为啥我的 .htaccess 301 重定向规则不起作用?