mod_rewriteはGETパラメータを転送しません


9

開発マシンで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

回答:


16

QSA(Query String Append)フラグを使用してみましたか?

RewriteRule ^static/([^/]+)/([^/]+) /static.php?sISOCode=$1&sPage=$2 [QSA]

以下の編集と実際の回答:

この問題は、Apacheのmod_negotiation、特に使用しているMultiViewsオプションが原因で発生します。

マルチビューの効果は次のとおりです。サーバーが/ some / dir / fooのリクエストを受信した場合、/ some / dirでマルチビューが有効になっていて、/ some / dir / fooが存在しない場合、サーバーは探しているディレクトリを読み取ります。 foo。*という名前のファイルを作成し、それらのファイルすべてに名前を付けるタイプマップを事実上偽装して、クライアントがファイルの1つを名前で要求した場合と同じメディアタイプとコンテンツエンコーディングを割り当てます。次に、クライアントの要件に最適なものを選択します。

マルチビューを有効にすると、URIが既存の場所を実際に指していない場合に使用するファイルを推測するようApacheに指示します。

解決:

-MultiViews.htaccessで使用するか、すべて一緒に除外して、マルチビューを無効にします。


1
私もそれを提案したかったのですが、得られないこと:必要ないはずです-少なくともマニュアルを読んだ後はそうは思いません。この質問がどのようになるのか知りたい
ピリフ

1
この状況では、残念ながらQSAフラグは何も変更しません。GETパラメーターは、元のURLからではなく、ルールによって追加されます。
Vegard Larsen、

2

解決策は、次のようにApache構成を変更することでした。

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName project.example.com

        DocumentRoot /home/veg/workspace/project
        <Directory /home/veg/workspace/project>
                Options FollowSymLinks
                # 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>

なぜこれが機能するのか分かりませんが


2
説明のために私の改訂前の回答を参照してください:serverfault.com/questions/60/...
アロンRotteveel

0

htaccessファイルの-MultiViewsを無効にして以下のようにします

RewriteEngine on
Options -Indexes -MultiViews

RewriteRule ^static/([^/]+)/([^/]+)     /static.php?sISOCode=$1&sPage=$2

これで問題は解決します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.