web-dev-qa-db-ja.com

http://example.com/not_foundが要求されたときに、デフォルトの403禁止エラーページを強制的に出力するにはどうすればよいですか?

これはStackExchangeに関する私の最初の質問ですので、ご了承ください。現在の設定の簡単な内訳を以下に示します。

  • 同じホスティングプラン上の2つの異なるドメイン、2つの異なるTLD(.dkおよび.de
  • プライバシーのために、ドメイン名が"example website"、つまりhttps://www.example.dkhttps://www.example.deであると仮定しましょう
  • 両方のドメインで設定されたSSL
  • WordPress駆動、WPMLを使用して、それに応じて翻訳されたコンテンツを提供します

問題は、/ not_foundのヒット(中国、インド、パキスタンなど)からクレイジーな量を取得していることです。 bothドメイン名のURLの末尾、可能なすべての形式:

  • セキュア、wwwプロトコル(https://www.example....../not_found
  • 安全、wwwプロトコルなし(https://example....../not_found
  • 非セキュア、wwwプロトコル(http://www.example....../not_found
  • 非セキュア、wwwプロトコルなし(http://eksemp....../not_found

私にとって、この独特のパターンは、特にサイトのコンテンツがデンマーク語またはドイツ語で書かれていることを考慮すると、脆弱性スキャンの試みに他ならないようです。さらに、ウェブサイトは特定のデンマーク語、またはドイツのターゲットグループに対応しているため、ウェブサイトがこれらのアジア諸国からの訪問者に訪れる価値はほとんどありません。現在、サーバーの応答は、使用しているWordPressテーマによって提供される404-not foundページです。実際に存在しない場合。

長い話は短くなりましたが、指定されたURLが存在しないため、404ページではなく403-forbiddenページをWebサーバーに強制的に出力させる方法を見つけるために過去数日間苦労しましたサーバー上。

正規表現 を作成し、.htaccessファイルで上記のすべてのシナリオをカバーするパターンとして使用することを目指しています(各ドメイン名に4つ)。 .htaccessに配置したコードの部分は次のようになります

# BEGIN /not_found blocking
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^(https{0,1}:\/\/)(www\.){0,1}(example\.dk|example\.de){1}(\/not_found){1}$
RewriteRule . - [R=403,NC]
</IfModule>
# END /not_found blocking

残念ながら、403 Access Forbiddenの代わりに404-not foundエラーページが表示されるため、機能しません。それは私のせいでしょうが、その理由は何ですか?

どんな助けも大歓迎です。どうもありがとう!

4
GeekRider
RewriteCond %{REQUEST_URI} ^(https{0,1}:\/\/)(www\.){0,1}(eksempelhjemmeside\.dk|eksempelhjemmeside\.de){1}(\/not_found){1}$
RewriteRule . - [R=403,NC]

あなたはここで物事を過度に複雑にしているように見えるでしょう。 REQUEST_URIサーバー変数には、URLパスのみが含まれます。 /not-found。そして、これがあなたが心配しているように見えるすべてです。ドメインを確認する必要はありません。www/ non-www、HTTP/HTTPS、とにかくすべてのバリエーションを一致させたいようです。あなたがキャッチしたくない他のサブドメインなどがない限り? (しかし、その場合、ターゲットよりも例外を一致させる方が簡単かもしれません?)

ただし、コメントで@closetnocが示唆したように、これらのリクエストに対しては単純な「404 Not Found」を返します。 「シンプル」とは、デフォルトのApache 404を意味するため、WordPressを介してリクエストを渡すのではなく、早期に失敗します。これは現在行われていることです。したがって、必要なのは次のようなものだけですbefore the WordPress front-controller:

# BLOCK /not_found
RewriteRule ^not_found$ - [R=404]

<IfModule>ラッパー、RewriteEngineディレクティブ(WPブロックに既に含まれているため)、またはRewriteCondディレクティブは不要です。 3xx以外のステータスコードを指定する場合、Llast)フラグも必要ありません(暗黙的です)。

/NoT_FounD/NOT_FOUNDなどのリクエストを取得する場合は、NCnocase)フラグを含めることができますが、それ以外の場合は省略します。

.htaccessでは、RewriteRulepatternと一致するURLパスにスラッシュプレフィックスが含まれないことに注意してください。したがって、パターン^not_found$は、URL /not_foundとのみ一致します。

academic excerciseとして、404ではなく「403 Forbidden」を返したい場合は、上記のディレクティブを次のように変更します。

RewriteRule ^not_found$ - [F]

繰り返しますが、Lフラグを使用する場合は、Fフラグは不要です。または、代わりにR=403と書くこともできますが、Fが推奨されるショートカットです。

1
MrWhite

このhtaccessコードを使用して、URLから特定の単語を削除し、ホームページにリダイレクトします。あなたの状況に合わせて修正しました。このバージョンはテストしていませんが、動作するはずです。アンダースコアのために何か特別なことをする必要があるかどうかはわかりません。

RewriteEngine On
RewriteBase /
RewriteRule ^(.*)not_found(.*)$ $1$2  [R=301,L]

/ not_foundページを作成し、phpでヘッダーステータスを403に設定するだけで済みます。

header('HTTP/1.0 403 Forbidden');

echo 'You are forbidden!';
0
Michael d