mod_rewrite GET parametrelerini iletmez


9

Geliştirme makinemde mod_rewrite ile Apache kurulumunda sorun yaşıyorum. Mod_rewrite aktif ve bazı kurallar için iyi çalışıyor. Bazı kurallar, amaçlandığı gibi çalışmaz:

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

Static.php Bunu (hata ayıklama için) yaparım:

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

Hangi baskılar ($ _SERVER dizisinden bazı öğeler kaldırıldı):

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
)

Her nasılsa kurala göre ayarlanan GET parametreleri geçmiyor. Aynı .htaccess dosyası diğer kurulumlarda kullanılıyor ve iyi çalışıyor. Bu sanal etki alanı için Apache yapılandırması:

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

Bu olduğunda erişim günlüğü ve hata günlüğü çıktı almaz. Herhangi bir fikir takdir.

Aynı dosya için çalışan bir kural örneği:

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

Yanıtlar:


16

QSA (Sorgu Dizesi Ekleme) bayrağını kullanmayı denediniz mi?

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

DÜZENLEME VE AŞAĞIDAKİ GERÇEK YANIT:

Bu soruna Apache'nin mod_negotiation , özellikle de kullandığınız MultiViews seçeneği neden olmaktadır:

MultiView'lerin etkisi aşağıdaki gibidir: sunucu / some / dir / foo için bir istek alırsa, / some / dir MultiViews etkinse ve / some / dir / foo yoksa, sunucu, foo. * adlı dosyaları etkin bir şekilde oluşturur ve tüm bu dosyaları adlandıran bir tür haritayı etkin bir şekilde sarar ve istemciye bunlardan birini adıyla sorsaydı sahip olacağı aynı medya türlerini ve içerik kodlarını atar. Daha sonra müşterinin gereksinimlerine en uygun olanı seçer.

Multiviews'un etkinleştirilmesi, Apache'ye URI gerçekten mevcut bir konumu göstermediğinde hangi dosyanın kullanılacağını tahmin etmesini söyler.

Çözüm:

-MultiViews.Htaccess'inizi kullanarak veya hepsini bir arada bırakarak çoklu görüntüleri devre dışı bırakın .


1
Bunu da önermek istedim, ama elde edemediğim şey: Gerekli olmamalı - en azından kılavuzu okuduktan sonra öyle düşünmüyorum. Bu sorunun nasıl ortaya çıkacağını merak
ediyorum

1
Ne yazık ki, QSA bayrağı bu durumda hiçbir şeyi değiştirmiyor. GET parametreleri orijinal URL'den değil kural tarafından eklenir.
Vegard Larsen

2

Çözüm, Apache yapılandırmasını değiştirmekti, şöyle:

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

Ancak bunun neden işe yaradığını bilmiyorum


2
Bir açıklama için gözden geçirilmiş önceki
yanıtımı görün

0

Aşağıdaki gibi bir şey htaccess dosyanızda -MultiViews devre dışı bırakın

RewriteEngine on
Options -Indexes -MultiViews

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

bu sorunu çözecek

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.