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
)

किसी तरह नियम के अनुसार निर्धारित जीईटी पैरामीटर नहीं मिल रहा है। वही .htaccess फ़ाइल अन्य सेटअप पर उपयोग में है, और अच्छी तरह से काम करती है। इस वर्चुअल डोमेन के लिए अपाचे कॉन्फ़िगरेशन:

<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 विकल्प में:

MultiViews का प्रभाव इस प्रकार है: यदि सर्वर को / कुछ / dir / foo के लिए अनुरोध प्राप्त होता है, यदि / / कुछ / dir में MultiViews सक्षम है, और / / कुछ / dir / foo मौजूद नहीं है, तो सर्वर निर्देशिका की तलाश में पढ़ता है foo। * नाम की फाइलें, और प्रभावी रूप से एक प्रकार का नक्शा तैयार करता है, जो उन सभी फाइलों को नाम देता है, जो उन्हें उसी प्रकार के मीडिया प्रकार और सामग्री-एनकोडिंग प्रदान करता है, यदि क्लाइंट ने उनमें से एक नाम के लिए पूछा था। यह ग्राहक की आवश्यकताओं के लिए सबसे अच्छा मैच चुनता है।

मल्टीवीव्स को सक्षम करना अपाचे को यह अनुमान लगाने के लिए कहता है कि किस फ़ाइल का उपयोग करना है जब यूआरआई वास्तव में किसी मौजूदा स्थान पर इंगित नहीं करता है।

समाधान:

-MultiViewsअपने .htaccess में उपयोग करके या इसे सभी को एक साथ छोड़ कर मल्टीव्यू को अक्षम करें ।


1
मैं यह भी सुझाव देना चाहता था, लेकिन जो मुझे नहीं मिलता है: इसकी जरूरत नहीं होनी चाहिए - कम से कम मुझे ऐसा नहीं लगता कि मैनुअल पढ़ने के बाद। जिज्ञासु यह सवाल कैसे करेंगे
pilif

1
क्यूएसए ध्वज इस स्थिति में कुछ भी नहीं बदलता है, दुर्भाग्य से। GET पैरामीटर नियम से जोड़े जाते हैं, मूल URL से नहीं।
वेगार्ड लार्सन

2

समाधान अपाचे विन्यास को इस तरह बदलना था:

<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

नीचे की तरह अपनी htaccess फ़ाइल में -MultiViews अक्षम करें

RewriteEngine on
Options -Indexes -MultiViews

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

इससे समस्या हल हो जाएगी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.