如何配置IIS以提供没有尾部斜杠的目录,并始终相对于根路径提供服务?

时间:2017-11-13 22:36:28

标签: iis webserver single-page-application

我有一个在IIS中托管的单页应用程序,我想确保所有请求都定向到/index.html(它将解释url并处理所有路由客户端)。此规则的唯一例外是当请求是针对磁盘上的实际文件,例如* .js,* .css,* .png等时(我仍然需要能够加载应用程序; - )。使用以下web.config文件几乎所有内容都能正常工作:

<configuration>
    <system.webServer>
        <httpErrors errorMode="Custom" existingResponse="Replace">
            <remove statusCode="404"/>
            <error statusCode="404" responseMode="ExecuteURL" path="/index.html" />
        </httpErrors>
    </system.webServer>
</configuration>

如果我请求mydomain.com/contact,则会按预期提供/index.html页面,但如果我请求mydomain.com/contact/(请注意额外的斜杠),那么我应用中的所有相对路径都会爆炸,因为浏览器尝试加载/contact/some-file.js而不是/some-file.js。我可以通过使我的所有路径都扎根来解决这个问题,但出于更多原因而不仅仅是惯性,我希望能够坚持使用相对路径。

当磁盘上的目录与请求的URL匹配时,会出现第二个相关问题。例如,如果我请求/服务并且磁盘上有/ services目录,则请求会自动更改为/ services /(我认为IIS是此处的罪魁祸首),然后产生403错误响应,因为IIS正确地拒绝提供服务目录内容。

请注意,将此添加到web.config可以部分解决第二个问题:

<remove statusCode="403"/>
<error statusCode="403" responseMode="ExecuteURL" path="/index.html" />

部分是因为它导致403无法使用/index.html进行响应,但其余资源是相对于/ services /而不是/来加载的(这是回到上面的相对路径的第一个问题)。它也是部分的,因为对/ services的请求仍然被更改为/ services /.

所以我的问题是当磁盘上有匹配的目录时如何防止/ services等路径被更改为/ services /如何让所有重定向服务来自root的响应并将所有路径路由保留到客户端(即处理/ contact /的请求,就好像它是/ contact的请求一样)?

更新 这似乎准确地描述了这个问题: https://support.microsoft.com/en-us/help/298408/iis-generates-courtesy-redirect-when-folder-without-trailing-slash-is

我使用的是IIS 10,但行为是一样的。

403状态代码用于'Forbidden',因为目录列表被正确拒绝,因此将此添加到web.config正在处理症状而不是原因。我测试了向web.config添加301和302,IIS不允许这样做并产生错误:

The 'statusCode' attribute is invalid. Integer value must be between 400 and 999 inclusive

1 个答案:

答案 0 :(得分:0)

根据:

https://forums.iis.net/t/1153462.aspx?Is+it+possible+to+disable+the+courtesy+301+redirect+for+URL+requests+that+lack+a+trailing+slash+

没有内置的方法来更改IIS中的301行为,并且使用url重写是解决此问题的唯一方法。所以我安装了IIS URL重写模块(https://www.microsoft.com/en-us/download/details.aspx?id=47337)并将其添加到web.config中:

    <rewrite>
        <rules>
            <rule name="Remove trailing slash" stopProcessing="true">
                <match url="(.*)/$" />
                <conditions>
                    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                </conditions>
                <action type="Redirect" redirectType="Permanent" url="{R:1}" />
            </rule>
        </rules>
    </rewrite>

现在所有带尾部斜杠的请求都将其删除,IIS不再执行301重定向以添加斜杠,客户端负载资源相对于根加载(由于没有尾部斜杠),以及客户端路由接管并加载正确的内容。

相关问题