mod_rewrite ไม่ส่งต่อพารามิเตอร์ GET


9

ฉันมีปัญหาในการตั้งค่า Apache ด้วย mod_rewrite บนเครื่องพัฒนาของฉัน 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 (แบบสอบถามสตริงผนวก) ?

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

แก้ไขและคำตอบที่เกิดขึ้นจริงด้านล่าง:

ปัญหานี้เกิดจากmod_negotiationของ Apache โดยเฉพาะตัวเลือก MultiViews ที่คุณใช้:

เอฟเฟกต์ของ MultiViews มีดังต่อไปนี้: หากเซิร์ฟเวอร์ได้รับการร้องขอสำหรับ / some / dir / foo หาก / some / dir เปิดใช้งาน MultiViews และ / some / dir / foo ไม่มีอยู่เซิร์ฟเวอร์จะอ่านไดเรกทอรีที่ค้นหา ไฟล์ชื่อ foo. * และทำแผนที่ชนิดที่มีประสิทธิภาพซึ่งตั้งชื่อไฟล์ทั้งหมดเหล่านั้นโดยกำหนดประเภทสื่อและการเข้ารหัสเนื้อหาที่เหมือนกันหากลูกค้าร้องขอชื่อหนึ่งในนั้น จากนั้นเลือกการจับคู่ที่ดีที่สุดตามความต้องการของลูกค้า

การเปิดใช้งาน Multiviews จะบอก Apache ให้เดาไฟล์ที่จะใช้เมื่อ URI ไม่ได้ชี้ไปยังตำแหน่งที่มีอยู่จริง

สารละลาย:

ปิดใช้งานการแสดงหลายรายการโดยใช้-MultiViewsใน. htaccess ของคุณหรือปล่อยให้อยู่ด้วยกัน


1
ฉันต้องการที่จะแนะนำเช่นกัน แต่สิ่งที่ฉันไม่ได้รับ: มันไม่จำเป็นต้องใช้ - อย่างน้อยฉันก็ไม่คิดอย่างนั้นหลังจากอ่านคู่มือ อยากรู้ว่าคำถามนี้จะเปิดออก
pilif

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/…
Aron Rotteveel

0

ปิดการใช้งาน -MultiViews ในไฟล์ htaccess ของคุณบางอย่างเช่นด้านล่าง

RewriteEngine on
Options -Indexes -MultiViews

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

สิ่งนี้จะแก้ไขปัญหาได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.