私は、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>
資格情報を提供せずに Web サイトを表示しようとすると、空白のページしか表示されません。ページのソースも完全に空白で、HTML タグが 1 つもありません。
これを機能させる方法について何かアイデアはありますか?
答え1
ここで何をしているのか考えてみてください。ユーザーが正しく認証されていない場合は、この別のページをユーザーに表示するということです。しかし、この (401) ページは認証されたユーザーにのみ表示できます。そのため、IIS はユーザーにそのページを表示できず、代わりに空白のページが表示されます。
これを回避するには少なくとも 2 つの方法があります。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 サイトのルートに対する相対パスです。
もう 1 つのオプションは、エラー フォルダーに web.config を追加し、このディレクトリに対して匿名認証を許可することです。結局のところ、このディレクトリにはエラー ページしかありません。