【问题标题】:IIS: URL Rewrite /signalr/ and /api/ to port 8080IIS:将 /signalr/ 和 /api/ 的 URL 重写到端口 8080
【发布时间】:2014-06-13 18:22:25
【问题描述】:

我有一个在端口 8080 上运行的自托管 API。在端口 80 上是我的 Web 服务器 (IIS 7.5) 和一个我无法访问的网站。我添加了一个应用程序“MyApiTestsite”。现在对 /api/ 或 /signalr/ 的所有请求我想转发到端口 8080:

http://mycompany/MyApiTestsite           -> untouched
http://mycompany/MyApiTestsite/signalr/* -> http://mycompany:8080/signalr/*
http://mycompany/MyApiTestsite/api/*     -> http://mycompany:8080/api/*

我已经安装了ARR(这甚至有必要吗?)和URL Rewrite

这是我目前的规则(对于 SignalR):

<rule name="Rewrite SignalR to port 8080" patternSyntax="Wildcard" stopProcessing="true">
  <match url="signalr/*" />
  <serverVariables>
    <set name="SERVER_PORT" value="8080" />
  </serverVariables>
  <action type="Rewrite" url="{R:0}" appendQueryString="true" logRewrittenUrl="false" />
</rule>

我检查了日志文件并匹配了规则。但是,它根本不起作用:

  • 我不知道如何摆脱RelativePath(我的应用程序)MyApiTestsite
  • 如果我检查日志,端口没有被替换

日志:

RULE_EVALUATION_END RuleName="Rewrite SignalR to port 8080", RequestURL="MyApiTestsite/signalr/hubs", QueryString="", StopProcessing="true", Succeeded="true"

URL_REWRITE_END RequestURL="/MyApiTestsite/signalr/hubs"

GENERAL_CHILD_REQUEST_START SiteId="4", RequestURL="http://mycompany:80/MyApiTestsite/signalr/hubs", RequestVerb="GET", RecursiveLevel="1"

更新: 我现在根据this帖子试了一下。但是,它仍然不起作用。 URL 看起来不错,但 MvcHandler 接管并返回 404:

URL_REWRITE_END RequestURL="http://mycompany:8080/signalr/hubs"

USER_SET AuthType="", UserName="", SupportsIsInRole="true"

HANDLER_CHANGED
OldHandlerName="ExtensionlessUrlHandler-Integrated-4.0", NewHandlerName="System.Web.Mvc.MvcHandler", NewHandlerModules="ManagedPipelineHandler", NewHandlerScriptProcessor="", NewHandlerType="System.Web.Mvc.MvcHandler, System.Web.Mvc, 版本=5.1.0.0"

GENERAL_SEND_CUSTOM_ERROR HttpStatus="404", HttpSubStatus="4", FileNameOrURL="404.htm"

更新 2:

这是我想要做的图片...

更新 3 这次我尝试改用Server Farms。我的 URL 发生了应有的更改,但后来又改回了旧 URL:

ARR_WEBFARM_ROUTED WebFarm="mycompany API", Algorithm="LeastRequests"
HANDLER_CHANGED OldHandlerName="", NewHandlerName="ApplicationRequestRoutingHandler", NewHandlerModules="ApplicationRequestRouting", NewHandlerScriptProcessor="", NewHandlerType=""
ARR_SERVER_ROUTED RoutingReason="LoadBalancing", Server="mycompany", State="Active", TotalRequests="1", FailedRequests="0", CurrentRequests="1", BytesSent="0", BytesReceived="0", ResponseTime="0"
GENERAL_SET_REQUEST_HEADER HeaderName="Max-Forwards", HeaderValue="10", Replace="true"
GENERAL_SET_REQUEST_HEADER HeaderName="X-Forwarded-For", HeaderValue="xxx.xx.xx.xxx:52327", Replace="true"
GENERAL_SET_REQUEST_HEADER HeaderName="X-ARR-SSL", HeaderValue="", Replace="true"
GENERAL_SET_REQUEST_HEADER HeaderName="X-ARR-ClientCert", HeaderValue="", Replace="true"
GENERAL_SET_REQUEST_HEADER HeaderName="X-ARR-LOG-ID", HeaderValue="f8exxxc2-7a6d-4cf6-a3c6-ecde245a0d80", Replace="true"
GENERAL_SET_REQUEST_HEADER HeaderName="Connection", HeaderValue="", Replace="true"
//>>>>>now it gets changed back!!! Why????<<<<<<
URL_CHANGED OldUrl="http://mycompany API/signalr/hubs", NewUrl="/MyApiTestsite/signalr/hubs"

【问题讨论】:

  • 您的 IIS 配置是否正确?请参阅asp.net/signalr/overview/signalr-20/… 了解确切的规格
  • 让我们这样说:如果我在端口 8080 上硬编码 API/SignalR 访问并使用 CORS,那么一切都会按预期工作。但是,我想对用户隐藏这些信息。
  • ARR 应该不是必需的,只是 URL 重写。
  • 我遇到了同样的问题。 (正确)重写的 URL 被劫持并恢复为原始值。这似乎是 URL Rewrite/ARR 和 MVC 之间的不兼容。

标签: iis url-rewriting signalr self-hosting arr


【解决方案1】:

配置以下URL重写规则:

Requested URL: Matches the pattern
Using: Regular Expressions
Pattern: MyApiTestsite/(signalr/.*)
Action: Rewrite
Rewrite URL: http://mycompany:8080/{R:1}

编辑:{R:1} 匹配第一个捕获的正则表达式组,在这种情况下匹配 (signalr/.*)。如果它是{R:0},它将放置匹配的整个相对 URL。 请参阅IIS URL Rewrite {R:N} clarification 了解更多信息。

【讨论】:

  • 谢谢。但是,我认为我的规则在应用时并没有错。问题是为什么它会变回来......
  • 从技术上讲,您的规则没有错,但它并没有按照您的意愿行事 - 例如从 URL 中删除 MyApiTestsite。我建议你的规则应该这样做。
  • 我的建议也与使用简单的 URL 重写有关。我认为您根本不需要服务器场来进行您想要的设置。
【解决方案2】:

试试这个:这行得通!

<rewrite>
        <rewriteMaps>
            <rewriteMap name="root">
                <add key="/root/" value="/" />
            </rewriteMap>
        </rewriteMaps>
        <rules>
            <clear />
            <rule name="MyRedirect" stopProcessing="true">
                <match url="^MYApiTestsite/(api|signalr)(/.*)?" />
                <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
                <action type="Redirect" url="http://mycompany:8080/{R:1}{R:2}" />
            </rule>
        </rules>
    </rewrite>

如果你想使用 GUI 那么

【讨论】:

    猜你喜欢
    • 2017-09-21
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2021-07-14
    • 2012-11-11
    • 2020-03-18
    • 2020-03-22
    相关资源
    最近更新 更多