为什么此 IIS7 重写要执行重定向?

为什么此 IIS7 重写要执行重定向?

我有一个使用 301 重定向响应的重写规则,但我不知道为什么。

我在 WinHost 共享主机上,使用 IIS 7 重写从我的帐户的子文件夹托管我拥有的另一个域。

默认情况下,WinHost 会将您的其他域名指向您帐户的根目录。所以我的目标有两个:

  1. 我想将这些其他域文件物理地分开保存在子文件夹中
  2. 我想从地址栏隐藏所述子文件夹

以便:

http://myotherdomain.com

服务来源:

E:\account_root\myotherdomain

因此,我使用 IIS 7 重写模块生成了此规则。

<xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Test" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="(^|\.)myotherdomain\.com$" />
                    </conditions>
                    <action type="Rewrite" url="myotherdomain/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

我想要将请求myotherdomain.com偏移到myotherdomain子文件夹中。

这是可行的,但前提是请求中没有路径。如果我请求,http://myotherdomain.com我会收到 200 响应,并且在我的浏览器中,我会看到位于 的默认文档E:\account_root\myotherdomain。没有发生重定向。

如果您向请求添加路径,例如http://myotherdomain.com/test,现在我会收到到重写 URL 的 301 重定向:

Response: HTTP/1.1 301 Moved Permanently
Location: http://myotherdomain.com/myotherdomain/test/

然后浏览器会获取:

Request: GET /myotherdomain/test/ HTTP/1.1

然后,重写规则再次在 IIS 上运行,最终 IIS 尝试提供位于以下位置的默认文档:

E:\account_root\myotherdomain\myotherdomain\test

不存在的:

Response: HTTP/1.1 404 Not Found

因此重写本身似乎有效;我不明白的是为什么 IIS 会将 301 重定向混入其中,但只有当请求中存在路径时才会这样做。

答案1

难道不是重定向以添加尾随的 / 吗?

答案2

您的规则看起来正确,并且确实进行了重写而不是重定向,正如您所假设的那样。在我看来,您网站中的其他内容导致了 301 客户端重定向。尝试测试 .htm 页面,看看是 aspx 还是 htm 执行了重定向。您的 URL 重写规则不会导致这种情况。

你说的对。我针对这种情况发表了几篇博文,其中包括以下规则:

相关内容