我有一个 ASP.NET 网站,为了捕获错误的 URL 请求并将其重定向到主页,我输入了:
<customErrors defaultRedirect="/" mode="On">
<error statusCode="404" redirect="~/"/>
</customErrors>
在我的 web.config 中
这仅适用于类似的页面http://mywebsite/wrong.aspx
,但不适用于文件夹(例如http://mywebsite/wrong-folder/
:)
我知道我必须捕获所有请求才能解决这个问题,但是我无法访问 IIS 来使用 ISAPI 进行该设置...
这可以在 web.config 中完成吗?您有示例吗?
答案1
该<customErrors>...</customErrors>
标签仅控制 ASP.NET 在发生错误时将执行的操作。如果您访问不存在的目录,则错误将由 IIS 而不是 ASP.NET 处理。
因此,您必须更改 IIS 的 404 处理方式。这只能通过文件来完成,applicationHost.config
但通常只有管理员权限才能访问。以下是该文件的摘录,它将 404 处理方式更改为特定网站的自定义页面:
<location path="[Your Site Name]">
<system.webServer>
<httpErrors errorMode="DetailedLocalOnly">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" prefixLanguageFilePath="" path="/your-404-handler.aspx" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
</location>
您也可以通过 IIS 管理器更改此设置,方法如下:Sites -> [Your Site Name] -> Error Pages -> 404
答案2
这可以通过使用微软 URL 重写。如果已安装模块,请将以下规则添加到您的 web.config。任何不匹配“MyPage.aspx”(不区分大小写)的请求都将通过发出 HTTP 301 来响应,其中 MyPage.aspx 为新位置。您需要在“条件”下将所有可接受的 URL 列入白名单,尽管这是使用自定义错误的替代方法。
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="RedirectToMyPage" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{REQUEST_URI}" pattern="^MyPage.aspx$" negate="true" />
</conditions>
<action type="Redirect" url="MyPage.aspx" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
另一种选择是利用 URL 重写和 customErrors,通过配置 customErrors 将 404 错误重定向到诸如“/404Error.aspx”之类的页面(该页面不需要存在),然后制定一个 URL 重写规则,将所有对“/404Error.aspx”的请求重定向到您的主页。此 URL 重写规则如下所示:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="RedirectToMyPage" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{REQUEST_URI}" pattern="^404Error.aspx$" />
</conditions>
<action type="Redirect" url="MyPage.aspx" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>