我在 Windows Server 2012 下的 IIS8 上运行基于 PHP 的应用程序。我尝试使用自定义错误页面来处理失败的身份验证尝试 - 通过替换 401 错误页面。
这是我的web.config:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpRedirect enabled="false" destination="https://my.website.co.uk" />
<rewrite>
<rules>
<rule name="Hide Yii Index" stopProcessing="true">
<match url="." />
<action type="Rewrite" url="index.php" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
</rule>
</rules>
</rewrite>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="401" subStatusCode="-1" />
<error statusCode="401" path="/errors/401.htm" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
</configuration>
当我尝试在不提供凭证的情况下查看网站时,看到的只是一个空白页。页面的源代码也是完全空白的 - 没有任何一个 html 标签。
有什么想法我可以如何实现它吗?
答案1
想想你在这里做什么。你说如果用户没有正确通过身份验证,就向用户显示另一个页面。但是这个 (401) 页面只能显示给经过身份验证的用户。因此 IIS 不允许向用户显示该页面,而是显示一个空白页。
至少有两种方法可以解决这个问题,将 httpErrors 更改为:
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="401" subStatusCode="-1" />
<error statusCode="401" path="errors\401.htm" responseMode="File" />
</httpErrors>
通过将 responseMode 更改为File
,iis 不再执行 URL,而是加载文件内容并将其发送给用户。无论身份验证状态如何,这始终有效。路径相对于网站的根目录。
另一个选择是将 web.config 添加到您的错误文件夹并允许对该目录进行匿名身份验证,毕竟它只有错误页面。