10

PHP ベースのアプリケーションの 1 つのデプロイメントでMultiViewsは、リクエスト ディスパッチャ スクリプトの .php 拡張子を隠すために Apache のオプションが使用されています。例えば、へのリクエスト

/page/about

...によって処理されます

/page.php

... で利用可能なリクエスト URI の末尾部分を使用しPATH_INFOます。

ほとんどの場合、これで問題なく動作しますが、次のようなエラーが発生することがあります。

[error] [client 86.x.x.x] no acceptable variant: /path/to/document/root/page

私の質問は次のとおりです。このエラーが時々発生する原因と、問題を解決するにはどうすればよいですか?

4

2 に答える 2

4

Mark Amery による回答はほぼ完全ですが、スイート スポットが欠けており、「リクエストで延長が指定されていないため、代替案で交渉が失敗する」という問題に対処していません。

このエラーは、次の構成スニペットを追加することで解決できます。

PHP 設定は次のようになります。

<FilesMatch "\.ph(p3?|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>

AddType application/x-httpd-php .phpまたはその他の AddTypeを使用しないでください

追加の構成は次のようになります。

RemoveType .php
<Files "*.php">
    MultiviewsMatch Any
</Files>

AddType を使用すると、次のようなエラーが発生します。

GET /index/123/434 HTTP/1.1
Host: test.net
Accept: image/*

HTTP/1.1 406 Not Acceptable
Date: Tue, 15 Jul 2014 13:08:27 GMT
Server: Apache
Alternates: {"index.php" 1 {type application/x-httpd-php}}
Vary: Accept-Encoding
Content-Length: 427
Connection: close
Content-Type: text/html; charset=iso-8859-1

Accept: image/*ご覧のとおり、index.php は見つかりますが、 to と一致しないため、この代替手段は使用しませんapplication/x-httpd-php。リクエスト/index.php/1/2/3/4すると、うまくいきます。

この理由は、mod_negotiation モジュールのソース コードで見つかりました。.php タイプが 'cgi' の場合に Apache が動作する理由を見つけようとしていましたが、それ以外の場合は動作しません (ヒント:application/x-httpd-cgiハードコードされています..)。ソースにいる間に、そのファイルの Content-Type が Accept ヘッダーと一致した場合、またはそのファイルの Content-Type が空の場合にのみ、Apache がファイルを一致として認識することに気付きました。

SetHandler を使用すると、apache は .php ファイルを .php ファイルとして認識しませんapplication/x-httpd-phpが、残念ながら、多くのディストリビューションでもこれを /etc/mime.types ファイルで定義しています。したがって、このバグが気になる場合は、設定に を追加しRemoveType .phpてください。

于 2014-07-15T13:39:29.817 に答える