【问题标题】:Setting up URL Rewrite rule for a specific domain为特定域设置 URL 重写规则
【发布时间】:2013-06-08 10:02:13
【问题描述】:

对于本地开发测试,我需要捕获对www.somedomain.com/XXX(其中X 是路径)的所有请求,并将它们发送到localhost/somevdir/XXX

我已将此添加到我的 HOSTS 文件 (c:\windows\system32\drivers\etc):

127.0.0.1   www.mydomain.com

然后,在 IIS8 (Windows 8) 中,我为主机 www.mydomain.com 添加了绑定到我的“默认网站”。这行得通,我现在可以浏览 www.mydomain.com/test.html 并查看测试 html 页面。我的虚拟目录位于默认网站内。然后,我将 URL 重写 URL 添加到网站的最后一点:

<rewrite>
    <rules>
        <rule name="mydomain.com" stopProcessing="true">
            <match url="^www.mydomain.com/(.*)" />
            <action type="Rewrite" url="localhost/MyVDir/{R:1}" logRewrittenUrl="true" />
        </rule>
    </rules>
</rewrite>

但是——那行不通。我得到一个 404,所以看起来匹配永远不会发生。我尝试过重定向和重写,并且尝试过不使用正则表达式中的 ^ 和其他一些正则表达式调整。谁能解释我做错了什么?

【问题讨论】:

    标签: iis url-rewriting web-config iis-8


    【解决方案1】:

    我认为以下应该可行:

    <rule name="mydomain.com" stopProcessing="true">
        <match url="(.*)" />
        <conditions logicalGrouping="MatchAll">
            <add input="{HTTP_HOST}" pattern="^(mydomain\.com|www\.mydomain\.com)$" />
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        </conditions>
        <action type="Redirect" url="http://localhost/MyVDir/{R:1}" redirectType="Temporary" />
    </rule>
    

    任何 URL 上的匹配确保检查条件,并且 HTTP_HOST 服务器变量似乎是检查请求的主机名的最可靠方法。您可以删除 REQUEST_FILENAME 输入条件,但它可以作为一个很好的健全性检查来确保始终提供静态文件。

    【讨论】:

    • 几乎 :) 我不得不使用重定向(重写不起作用),并且必须指定主机的完整路径(http://localhost/MyVDir/{R:1})但是一旦我这样做了,我就是在:)
    • 您不应该转义域名模式中的句点吗? ^((mydomain\.com)|(www\.mydomain\.com))$
    • 好地方,幸运的是,从句点匹配的任何字符都不太可能成为问题,因为大多数人不会有 wwwXmydomain.com,其中 X 是一个随机字母。不需要额外的括号。
    • 这对子域情况也有很大帮助,例如,主域会将所有 HTTP 重定向到 HTTPS,但我不希望我的子域发生这种情况,例如 'app2.mydomain.com' 应该仍然响应 HTTP ......这通过从规则中排除子域有很大帮助。非常感谢!
    【解决方案2】:

    以下内容更适合同时捕获www. 和非www. 版本的域,这样您就不必两次编写域,这可能会导致错误,因为写错字的可能性是两倍. (带有? 字符的括号在正则表达式中表示可选。)

    <rule name="mydomain.com" stopProcessing="true">
        <match url="(.*)" />
        <conditions logicalGrouping="MatchAll">
            <add input="{HTTP_HOST}" pattern="^(www.)?mydomain\.com$" />
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        </conditions>
        <action type="Redirect" url="http://localhost/MyVDir/{R:1}" redirectType="Temporary" />
    </rule>
    

    【讨论】:

      猜你喜欢
      • 2016-10-17
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多