mod_rewrite không chuyển tiếp tham số GET


9

Tôi gặp sự cố khi thiết lập Apache với mod_rewrite trên máy phát triển của mình. Mod_rewrite đang hoạt động và hoạt động tốt đối với một số quy tắc. Một số quy tắc không hoạt động như dự định, như quy tắc này:

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

Trong static.php tôi làm điều này (để gỡ lỗi):

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

Bản in nào (đã xóa một số mục khỏi mảng $ _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
)

Bằng cách nào đó, các tham số GET được đặt theo quy tắc không được thông qua. Tệp .htaccess tương tự được sử dụng trên các thiết lập khác và hoạt động tốt. Cấu hình Apache cho miền ảo này:

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

Nhật ký truy cập và nhật ký lỗi không xuất hiện gì khi điều này xảy ra. Bất kỳ ý tưởng đánh giá cao.

Một ví dụ về quy tắc hoạt động, cho cùng một tệp:

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

Câu trả lời:


16

Bạn đã thử sử dụng cờ QSA (Nối chuỗi truy vấn) chưa?

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

EDIT, VÀ TRẢ LỜI THỰC TẾ DƯỚI ĐÂY:

Vấn đề này là do mod_negotiation của Apache , đặc biệt là tùy chọn MultiViews bạn đang sử dụng:

Tác dụng của MultiViews như sau: nếu máy chủ nhận được yêu cầu cho / some / dir / foo, nếu / some / dir đã bật MultiViews và / some / dir / foo không tồn tại, thì máy chủ sẽ đọc thư mục tìm kiếm các tệp có tên foo. *, và tạo ra một bản đồ loại có tên tất cả các tệp đó, gán cho chúng cùng loại phương tiện và mã hóa nội dung mà nó sẽ có nếu khách hàng yêu cầu một trong số chúng theo tên. Sau đó, nó chọn kết quả phù hợp nhất với yêu cầu của khách hàng.

Việc kích hoạt Multiview cho Apache biết đoán tệp nào sẽ được sử dụng khi URI không thực sự trỏ đến một vị trí hiện có.

Giải pháp:

Vô hiệu hóa nhiều -MultiViewstệp bằng cách sử dụng trong .htaccess của bạn hoặc để tất cả cùng nhau.


1
Tôi cũng muốn đề xuất điều đó, nhưng điều tôi không nhận được: Không cần thiết - ít nhất tôi không nghĩ như vậy sau khi đọc hướng dẫn. Tò mò làm thế nào câu hỏi này sẽ bật ra
pilif

1
Thật không may, cờ QSA không thay đổi gì trong tình huống này. Các tham số GET được thêm vào theo quy tắc, không phải từ URL gốc.
Vegard Larsen

2

Giải pháp là thay đổi cấu hình Apache, như thế này:

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

Tôi không biết tại sao điều này hoạt động, tuy nhiên


2
Xem câu trả lời sửa đổi trước đây của tôi để được giải thích: serverfault.com/questions/60/ Kẻ
Aron Rotteveel

0

Vô hiệu hóa -MultiViews trong tệp htaccess của bạn một cái gì đó như dưới đây

RewriteEngine on
Options -Indexes -MultiViews

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

điều này sẽ giải quyết vấn đề

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.