17

特殊なケース (例: .ht* ファイルまたは特定のディレクトリ) で 403 の代わりに 404 を返すことについて、いくつかの質問が既にここに投稿されていますが、すべての403 応答を単純に置き換える方法がわかりません (「わかりました。存在しますが、まだ道を見つける必要があります") と 404s ("申し訳ありませんが、聞いたことがありません")。サイトの変更に合わせて .htaccess の正規表現やその他のビットを更新する必要がない単純な解決策があることを願っています。「403 を返すことにしたときはいつでも、代わりに 404 を返す」という単純な指示だけが適用されます。構成の変更に関係なく、サイト全体に。

次に、最上位の .htaccess に「Options -Indexes」が含まれていて、特定のディレクトリに index.html (または同等のもの) が含まれていない場合、ベア ディレクトリ URL は 404 を返しますが、そのディレクトリに index.html を追加すると、同じ裸のディレクトリ URL は index.html を返し、.htaccess ファイルを更新する必要はありません。

ディレクトリにパスワードを設定した場合に、間違ったパスワードで 404 が返されても気にしません (404 -> 403 マッピングのため)。その場合、404 を返して何も隠しているわけではありませんが、害もありません。ただし、特別な場合に一般的な 403->404 マッピングを (特別な場合に DO するのではなく) UNDO する方法があれば、さらに便利です。

もちろん、私が何か見落としている場合は、正してください。

編集:ドラフト。私は質の高い質問をここに書き込もうとしていましたが、2 番目の段落の「オプション - インデックス」の動作に関する私の説明が間違っていることが判明しました。その行がないと、ディレクトリに存在する場合、裸のディレクトリ URL に「index.html」が表示されます。それ以外の場合は、ディレクトリの内容が明らかになります。(index.html が存在する場合、/dir を /dir/index.html に転送するのは、私が間違っていない限り、Web ホストのデフォルト設定です。) 404 ではなく 403 を返しますが、それでも dir の内容を公開するよりはましです)。

裸の dir URL "mysite.com/mydir" が存在する場合は /mydir/index.html を表示し、存在しない場合は "404" を表示することを望みますが、明らかに 403 を 404 に置き換えるだけではありません。

4

5 に答える 5

13

ここでより良い回答の 1 つを完了するには (@WebChemist と @JennyD で言及されているように)、これを解決する良い方法は、エラー404 Not Foundの処理に使用するドキュメントから戻ることです。403個人的には以下のようなことをしています。

.htaccessWeb ルート (関連する抜粋):

ErrorDocument 400 /http-errors.php
ErrorDocument 403 /http-errors.php
ErrorDocument 404 /http-errors.php

http-errors.phpWebルート(凝縮された作業例):

<?php

$status = $_SERVER['REDIRECT_STATUS'];
// If it's a 403, just bump it up to a 404
if ( $status == 403 ) $status++;

$codes = array(
  400 => array( '400 Bad Request', 'The request cannot be fulfilled due to...' ),
  404 => array( '404 Not Found', 'The resource you requested was not found...' ),
  500 => array( '500 Internal Server Error', 'The request was unsuccessful...' )
);

$title = $codes[$status][0];
$message = $codes[$status][1];

header( $_SERVER['SERVER_PROTOCOL'] . ' ' . $title );
echo "<h1>$title</h1>\n<p>$message</p>";
于 2013-05-14T21:34:49.750 に答える
3

次のようにして、偽の 403 -> 404 を簡単に実行できます。

ErrorDocument 403 /404.php

404.php はフォーマットされた 404 応答ページですが、それでも応答ヘッダーで 403 が返されます。404 ヘッダーを返したい場合は、404 コードを返すヘッダー リダイレクトを含む 403 ページを作成できますが、リダイレクトがまだ表示される可能性があります....

純粋な .htaccess でキャッチオール 403->404 置換を実行できるかどうかはよくわかりません

編集:

あなたが試すことができる2つの純粋な.htaccessメソッドで遊んでみました:

1) スラッシュで終わる URL を次のようなインデックス ページにリダイレクトします。

RewriteRule ^(.*)/$ /$1/index.php [NC,L]

したがって、インデックス ページがある場合は表示されますが、そうでない場合は、見つからないインデックス ページ リクエストで 404 になります。[R] を省略しても、URL は依然として / 非 index.php 正規 SEO フレンドリー URL として表示されます :) これが他の場所で問題を引き起こすとは言えませんが..

2)

書き換えルールでは、r=404 を使用して 404 コードを返すことができます。

RewriteRule ^(.*)/$ - [R=404, NC,L]

しかし RewriteCond %{REQUEST_FILENAME} !-f 、または RewriteCond %{REQUEST_FILENAME} -d

つまり、インデックス ページが存在する場合でも、末尾のスラッシュはすべて 404 になります。追加の RewriteCond ルールで保護する (または無視する) フォルダーを指定することでこれを修正できますが、保護するフォルダーが追加されるにつれて RewriteCond ルールを追加する必要があるため、これは正確には「自動」ではありません。

于 2012-05-09T04:47:33.467 に答える
3

これは、ブロックしたディレクトリにある .htaccess ファイルの抜粋ですが、LAN マシンからのアクセスは許可しています。毎回404エラーを返します!!

# Turn rewrite engine on
RewriteEngine on
RewriteOptions Inherit

# Make it for a specific directory
# RewriteBase /phpMyAdmin 

# Block everyone except me
RewriteCond %{REMOTE_HOST} !^192.168.2
RewriteRule .? - [R=404,L]
于 2013-01-10T16:57:39.070 に答える
2

私の知る限り、そのような単純な指示はありません。それはまだ可能ですが、あなたが望むよりも少し複雑です。

ErrorDocument ディレクティブを使用して、403 応答をスクリプトに設定し、そのスクリプトが 403 応答ではなく 404 応答を返すようにすることができます。apache.orgに役立つヒントがいくつかあります。

于 2012-05-09T04:44:45.197 に答える