12

对于本地开发测试,我需要捕获所有对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,所以看起来匹配永远不会发生。我尝试过重定向和重写,并且尝试过不使用正则表达式中的 ^ 和其他一些正则表达式调整。有人可以解释我做错了什么吗?

4

2 回答 2

23

我认为以下应该有效:

<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 输入条件,但它可以作为一个很好的健全性检查来确保始终提供静态文件。

于 2013-06-12T12:56:47.300 回答
1

以下内容更适合同时捕获域的版本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>
于 2017-03-24T03:19:31.523 回答