web-dev-qa-db-ja.com

mod_aliasと `Redirect`ディレクティブで特殊文字を一致させることは可能ですか?

Apache 2.4.6をmod_aliasで使用しており、他のWebサイトのリンクからトラフィックを受け取っているWebサイトがあり、それを制御することはできません。他のサイトのリンクの形式が不適切であるため、外部サイトから私のサイトにアクセスした訪問者はすぐに400エラーを受け取ります。 URLは何らかの理由でリテラル%記号で終わります:domain.com/news/october_news.pdf%

サイドノート:発信元のWebサイトにアクセスできず、不明な理由でURLを変更しないと言えば十分です。)

私のサイトではmod_aliasRedirectディレクティブを頻繁に使用しているため、一貫性を維持し、将来のWebマスターのために同じディレクティブを使用することを望んでいました。ドキュメントを読んだことは可能に思えますが、それを機能させることができませんでした。 URL domain.com/news/october_news.pdf%にアクセスする人をdomain.com/news/october_news.pdfに301リダイレクトしようとしています。基本的には、パーセント記号をハックする必要があります。 mod_aliasRedirectを使用してどのように処理しますか?または、単にそれを行うことができないため、RedirectMatchを使用する必要があります。

現在、.htaccessファイルで次のそれぞれを試しました:

redirect “/news/october_news.pdf%” “/news/october_news.pdf”
redirect “/news/october_news.pdf%25” “/news/october_news.pdf”
redirect “/news/october_news.pdf\%” “/news/october_news.pdf”

これらはすべて、Apacheがブラウザに返す400 Bad Requestエラーを変更していません。

3
Wesley

Mod_alias Redirect(またはmod_rewrite RewriteRule-before mod_aliasを実行)を使用して400の「不正な要求」をキャッチすることはできません。これは、.htaccessとサーバー構成の両方のディレクティブに適用されます。 「不良リクエスト」は、リクエストのかなり早い段階でトリガーされます。

実際、.htaccessで不正なリクエストをトラップすることはできません。 .htaccessは処理されることさえありません-遅すぎます。

ただし、@ Stephenがコメントで示唆したように、カスタム400エラードキュメントをserver configで定義し、サーバー側スクリプト(PHPなど)を使用してそのようなリクエストを調べて、オーバーライドリダイレクトを発行できます。ただし、このエラードキュメントはmustserverまたはvirtualhostコンテキストで定義されている必要があります。 .htaccess(または<Directory>コンテナー)は遅すぎます。たとえば、<VirtualHost>コンテナで直接:

ErrorDocument 400 /errordocs/e400.php

次に、PHPの場合、%スーパーグローバルのREDIRECT_URL(またはREQUEST_URI)インデックスを使用して、要求されたURL(末尾の$_SERVERを含む)を調べることができます。適切なリダイレクト。

デフォルトの400応答が適切なリンクを備えた合理的でユーザーフレンドリーなメッセージを返すことを確認してください。そうしないと、ブラウザーのデフォルトが取得される可能性があります。


redirect “/news/october_news.pdf%” “/news/october_news.pdf”

脇:引数を囲むために中括弧..を使用するべきではありません-リクエストは決して一致しません(この理由でも)。引数を囲む必要がある場合は、直線の二重引用符を使用する必要があります。 "

これは302(一時)リダイレクトでもあります(テストのためだけに行ったのでしょうか?)。これは最終的に301(永続)リダイレクトになります。

1
MrWhite