エラーページの4つの不吉な16進数-およびそれらを克服する方法

この神秘的なグリッチは、一度に複数の条件が組み合わされた場合にのみ発生します。



あなたのサイトはApache Serverによってホストされています 。 (この条件を満たすことは難しくありません。現在、Apacheは最も人気のあるWebサーバーの1つです。)



サイトにはnginxキャッシングサーバーもあります。 (小さなサイトで共有ホスティングを購入すると、リソースを節約するためにホスティングプロバイダーがnginxをハングアップする最後の瞬間まで何も分からない場合があります。 もちろん、 HTTP応答のヘッダーを読んでよい場合を除きます。)



PHPで実行するエンジンを配置します。 (たとえば、CMS Drupal。 または、たとえば、 MediaWiki wiki。)



その後、エンジンによって作成されたエラーページNo. 404の外観を確認します。 wikiに存在しない記事のアドレスをフィードするか、Drupalに存在しないページのアドレスをフィードします。



そして、彼らは来ます。 4桁の16進数。 404エラー(および403)を説明するページのコードに表示され、このコードの「 <!DOCTYPE 」のに表示されるため、多くのブラウザー(Firefoxなど)は、ページの残りのテキストの上に表示する傾向があります。 CMSまたはwikiの作成者が考案した設計を破ります。



3340 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr"> <head> <title> … … …
      
      





問題は何ですか?



Drupalは、404エラーが発生した場合に、関数drupal_set_header( 'HTTP / 1.1 404 Not Found')を呼び出します。はい。MediaWiki(最新バージョン1.18でも確認済み)にも同様のエラーがあります。 エンジンは、スーパーグローバル変数$ _SERVER ['SERVER_PROTOCOL']の状態を慎重に確認する代わりに、 HTTPプロトコルバージョン1.1を使用すること安全であると単純に想定しています



一方、これは事実とはほど遠いです。nginxはバックエンドと通信する際にHTTPプロトコルバージョン1.0に依存します 。 次に、Apacheサーバーは、PHP応答でHTTP 1.1プロトコルを確認し(さらにContent-Lengthヘッダーがない)、 HTTP 1.1 切り替え応答をチャンクで送信し、ヘッダー「Transfer-Encoding: chunked」を提供しますが、nginxは助けにはなりません



問題を解決する方法は?



とても簡単です。 ApacheがHTTPバージョン1.0を代替なしで使用することを強制する2つのディレクティブを、Apacheサーバー構成(たとえば、wikiエンジンまたはCMSを含むディレクトリ内の.htaccessファイル)に配置するだけで十分です



 SetEnv force-response-1.0 1 SetEnv downgrade-1.0 1
      
      





これにより、すぐに目的を達成できます。



さて、あなたは上記の問題を新しいものと呼ぶことはできません-しかし、それを解決するための適切なレシピは 2009 サブレコードへのコメントのみあるため、完全にグーグルではありません。 個人的には、 WebFactionで見つけるのが簡単でした



私はHabrahabrに問題についての私自身の声明を掲載し、それを解決するための効果的なレシピを改めて伝えることで状況を修正しています。



All Articles