mod_rewrite tidak meneruskan parameter GET

9

Saya mengalami kesulitan menyiapkan Apache dengan mod_rewrite di mesin pengembangan saya. Mod_rewrite aktif, dan berfungsi dengan baik untuk beberapa aturan. Beberapa aturan tidak berfungsi sebagaimana dimaksud, seperti ini:

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

Di static.php saya melakukan ini (untuk debugging):

<?php
print_r($_GET); print_r($_POST); print_r($_SERVER); die();

Yang mencetak (menghapus beberapa item dari array $ _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
)

Entah bagaimana, parameter GET yang diatur sesuai aturan tidak dapat digunakan. File .htaccess yang sama digunakan pada pengaturan lain, dan berfungsi dengan baik. Konfigurasi Apache untuk domain virtual ini:

<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>

Log akses dan log kesalahan tidak menghasilkan apa-apa saat ini terjadi. Setiap ide dihargai.

Contoh aturan yang berfungsi, untuk file yang sama:

RewriteRule ^faq/?$                   /static.php?sISOCode=no&sPage=faq
Vegard Larsen
sumber

Jawaban:

16

Sudahkah Anda mencoba menggunakan flag QSA (Query String Append) ?

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

EDIT, DAN JAWABAN DI BAWAH INI:

Masalah ini disebabkan oleh mod_negotiation Apache , khususnya opsi MultiViews yang Anda gunakan:

Efek dari MultiViews adalah sebagai berikut: jika server menerima permintaan untuk / some / dir / foo, jika / some / dir telah mengaktifkan MultiViews, dan / some / dir / foo tidak ada, maka server membaca direktori yang mencari file bernama foo. *, dan secara efektif memalsukan tipe peta yang menamai semua file itu, menugaskan mereka jenis media yang sama dan pengkodean konten yang akan dimiliki jika klien telah meminta salah satu dari mereka dengan nama. Kemudian ia memilih yang paling cocok dengan kebutuhan klien.

Mengaktifkan Multiview memberi tahu Apache untuk menebak file mana yang akan digunakan ketika URI tidak benar-benar menunjuk ke lokasi yang ada.

Larutan:

Nonaktifkan multiview dengan menggunakan -MultiViewsdi .htaccess Anda atau biarkan semuanya.

Aron Rotteveel
sumber
1
Saya ingin menyarankan itu juga, tetapi apa yang saya tidak dapatkan: Seharusnya tidak diperlukan - setidaknya saya tidak berpikir begitu setelah membaca manual. Penasaran bagaimana pertanyaan ini akan muncul
pilif
1
Bendera QSA tidak mengubah apa pun dalam situasi ini, sayangnya. Parameter GET ditambahkan oleh aturan, bukan dari URL asli.
Vegard Larsen
2

Solusinya adalah mengubah konfigurasi Apache, seperti ini:

<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>

Namun saya tidak tahu mengapa ini berhasil

Vegard Larsen
sumber
2
Lihat jawaban saya sebelumnya yang telah direvisi untuk penjelasan: serverfault.com/questions/60/…
Aron Rotteveel
0

Nonaktifkan -MultiViews di file htaccess Anda seperti di bawah ini

RewriteEngine on
Options -Indexes -MultiViews

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

ini akan menyelesaikan masalah

Vikas Kandari
sumber