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
てください。