開発では問題なく動作するが、本番環境では正しく動作しない Web サイトを構築しました。問題が .htaccess に関連しているのか、不適切に構成された仮想ホストに関連しているのかはわかりません。基本的に、この問題は、 controllerおよびactionと呼ばれる URL パラメーターに依存するカスタム フレームワークでの URL の書き換えに伴います。domain.com/account/newなどの URL にアクセスすると、 domain.com/index.php?controller=account&action=newに書き換えられます。代わりに、ブートストラップの最初 (アプリケーション ロジックが何かを台無しにする前) でグローバルのダンプを実行すると、次のように表示されます。$_SERVER
["QUERY_STRING"]=> string(41) "controller=index.php&action=index¶ms="
そのピルクロー (段落マーカー) はどこから来たのですか? どの URL を試しても問題ありません。
注:同じサーバー上の他のサイトは問題なく URL の書き換えを行うことができます。これだけだそうです。
mod_rewrite モジュールがロードされ、php -i /に表示されることを確認しましたphpinfo()
。
これが私の.htaccessです:
RewriteEngine On
RewriteBase /
RewriteRule ^([^/]+/)*favicon\.ico$ assets/img/favicon.ico [L,NC]
RewriteCond %{REQUEST_URI} ^/assets.*$
RewriteRule ^(.*)$ - [L,NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !favicon\.ico
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)(/)([^/]+)(/)(.*) index.php?controller=$1&action=$3¶ms=$5 [L]
RewriteRule ^([^/]+)(/)(.*) index.php?controller=$1&action=$3¶ms= [L]
RewriteRule ^([^/]+)(/) index.php?controller=$1&action=index¶ms= [L]
RewriteRule ^([^/]+) index.php?controller=$1&action=index¶ms= [L]
開発環境:
MacOS 10.7
Apache 2.2.22
PHP 5.4.15
本番環境:
Linux (Kernel 2.6.32)
Apache 2.2.3
PHP 5.3.3
TL;DR; 私の .htaccess ルールは正しく書き直されておらず、pilcrow (段落マーカー) の後に "ms=" が続きます。これは私の htaccess ルールに問題がありますか? これはサーバーの問題のように見えますか? 私はこれを理解しようとして髪を引き裂いています。
編集#1
私の htaccess では、このようなものindex.php?controller=$1&action=$3¶ms=
に "¶" が含まれていることに気付きました。これは、pilcrow シンボルの HTML エンティティであり、そのシンボルの後にms=が続く理由が完全に理解できます。より大きな問題は、なぜ htaccess が HTML エンティティを処理するのかということです。
編集#2
わかりました、だから私は無知でなければなりません。ブラウザで見ていたので表示されていました。「ソースを表示」に行ったとき、それは["QUERY_STRING"]=> string(41) "controller=index.php&action=index¶ms="
. さて、$1 変数でファイル名index.phpをキャッチしている理由を理解しましょう。うーん。