这是一台生产 IIS Web 服务器,已正常运行一个月。服务器上有 6 个站点,上周其中一个站点开始出现随机 500 错误。这是两个使用 URL 重写的站点之一。我们与一位经验丰富的顾问讨论了大约 2 个半小时,但他无法给出明确的答案。重写规则是:
<httpErrors existingResponse="PassThrough" />
<rewrite>
<rules>
<rule name="Redirect .cfm extension" stopProcessing="false">
<match url="^(.*).cfm$" ignoreCase="true" />
<conditions logicalGrouping="MatchAny">
<add input="{URL}" pattern="(.*).cfm$" ignoreCase="false" />
</conditions>
<action type="Redirect" url="{R:1}" redirectType="Permanent" />
</rule>
<rule name="hide .cfm extension" stopProcessing="true">
<match url="^(.*)$" ignoreCase="true" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}.cfm" matchType="IsFile" />
</conditions>
<action type="Rewrite" url="{R:0}.cfm" />
</rule>
</rules>
我们取消了那条规则,从此以后就再也没有遇到过麻烦。
现在,使用 URL Rewrite 的其他网站正在给出随机错误,但是由于它是 API,因此修复这个错误有点复杂。
<httpErrors existingResponse="PassThrough" />
<rewrite>
<rules>
<rule name="ApiWithControllerAndId" stopProcessing="true">
<match url="^([^/]+)/([^/]+)/([^/]+)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.cfm?controller={R:1}&method={R:2}&id={R:3}" />
</rule>
<rule name="ApiWithController" stopProcessing="true">
<match url="^([^/]+)/([^/]+)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.cfm?controller={R:1}&method={R:2}" />
</rule>
</rules>
</rewrite>
它们似乎随机出现和消失。我们没有发现任何可以保证 500 响应的东西。我们有一个相同的暂存服务器,它没有给出任何 500 错误。我刚刚在此网站上启用了失败请求跟踪,但到目前为止还没有捕获到 500 错误。