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
)

어떻게 든 규칙에 따라 설정된 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 (Query String Append) 플래그를 사용해 보셨습니까 ?

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

아래의 편집 및 실제 답변 :

이 문제는 Apache의 mod_negotiation , 특히 사용중인 MultiViews 옵션 으로 인해 발생합니다 .

서버가 / some / dir / foo에 대한 요청을 받고 / some / dir에 MultiView가 활성화되어 있고 / some / dir / foo가없는 경우 서버는 디렉토리를 찾고 파일 이름은 foo. *이며 효과적으로 모든 파일의 이름을 지정하는 유형 맵을 가짜로 만들어서 클라이언트가 파일 이름 중 하나를 요청했을 때와 동일한 미디어 유형 및 내용 인코딩을 지정합니다. 그런 다음 고객의 요구 사항에 가장 적합한 것을 선택합니다.

멀티 뷰를 활성화하면 Apache가 실제로 URI가 기존 위치를 가리 키지 않을 때 사용할 파일을 추측하도록 지시합니다.

해결책:

-MultiViews.htaccess에서 사용 하거나 모두 함께 두어 멀티 뷰를 비활성화 하십시오.


1
나도 제안하고 싶었지만 얻지 못한 것 : 필요하지 않아야합니다. 적어도 매뉴얼을 읽은 후에는 그렇게 생각하지 않습니다. 이 질문이 어떻게
나올지

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

아래와 같이 htaccess 파일에서 -MultiViews 비활성화

RewriteEngine on
Options -Indexes -MultiViews

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

이 문제를 해결합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.