如何配置IIS以提供不带斜杠的目录,并始终相对于根路径提供服务



我有一个托管在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目录,那么请求会自动更改为/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/?我如何让所有重定向服务于来自根目录的响应,并将所有路径路由留给客户端(也就是说,将/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是治标不治本。我测试了将301和302添加到web.config,IIS不允许这样做,并产生错误:

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

根据:

https://forums.iis.net/t/1153462.aspx?Is+it+possible+to+disable+the+礼貌+301+redirect+for+URL+requests+that+lack+a+trail+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重定向以添加回斜杠,客户端加载资源是相对于根加载的(由于没有尾部斜杠),客户端路由接管并加载正确的内容。

最新更新