質問: mod_rewriteはgetパラメータを転送しません 開発マシンでmod_rewriteを使用してapacheをセットアップするのに問題があります。 mod_rewriteはアクティブであり、一部のルールで適切に機能します。次のような一部のルールは、意図したとおりに機能しません。rewriterule ^static/([^/]+)/([^/]+) /static.php?sisocode=$1&spage=$2 static.phpで私はこれを行います(デバッグ用):<?php print_r($_get); print_r($_post); print_r($_server); die(); どの印刷($ _server配列からいくつかの項目を削除):array ( ) array ( ) array ( [server_signature] => <address>apache/2.2.11 (ubuntu) php/5.2.6-3ubuntu4.1 with suhosin-patch server at alpha.prove.no port 80</address> [server_software] => apache/2.2.11 (ubuntu) php/5.2.6-3ubuntu4.1 with suhosin-patch [server_addr] => 127.0.0.1 [server_port] => 80 [remote_addr] => 127.0.0.1 [document_root] => /home/veg/workspace/project [server_admin] => webmaster@localhost [script_filename] => /home/veg/workspace/project/static.php [remote_port] => 38954 [gateway_interface] => cgi/1.1 [server_protocol] => http/1.1 [request_method] => get [query_string] => [request_uri] => /static/no/startcar [script_name] => /static.php [path_info] => /no/startcar [path_translated] => redirect:/index.php/startcar [php_self] => /static.php/no/startcar [argv] => array ( ) [argc] => 0 ) どういうわけか、ルールに従って設定されたgetパラメータが通過していません。同じ.htaccessファイルが他のセットアップで使用されており、正常に機能します。この仮想ドメインのapache構成:<virtualhost *:80> serveradmin webmaster@localhost servername project.example.com documentroot /home/veg/workspace/project <directory /home/veg/workspace/project> options indexes followsymlinks multiviews allowoverride all order allow,deny allow from all </directory> errorlog /var/log/apache2/error.log # possible values include: debug, info, notice, warn, error, crit, # alert, emerg. loglevel warn customlog /var/log/apache2/access.log combined </virtualhost> これが発生した場合、アクセスログとエラーログは何も出力しません。どんなアイデアでも大歓迎です。同じファイルに対して機能するルールの例:rewriterule ^faq/?$ /static.php?sisocode=no&spage=faq
回答: qsa(query string append) フラグを使用してみましたか?rewriterule ^static/([^/]+)/([^/]+) /static.php?sisocode=$1&spage=$2 [qsa] 以下の編集と実際の回答:この問題は、apacheの mod_negotiation 、特に使用しているmultiviewsオプションが原因で発生します。 multiviewsの効果は次のとおりです。サーバーが/ some/dir/fooの要求を受信した場合、/ some/dirでmultiviewsが有効になっていて、/ some/dir/fooが存在しない場合、サーバーは探しているディレクトリを読み取ります。 foo。*という名前のファイルを作成し、それらすべてのファイルに名前を付けるタイプマップを効果的に偽造して、クライアントがファイルの1つを名前で要求した場合と同じメディアタイプとコンテンツエンコーディングを割り当てます。次に、クライアントの要件に最適なものを選択します。 マルチビューを有効にすると、uriが実際に既存の場所を指していない場合に使用するファイルを推測するようにapacheに指示します。解決策:.htaccessで-multiviewsを使用するか、すべて一緒に除外して、マルチビューを無効にします。