Apache2 mod_rewrite URL 정리 - 작동하지만 파일에 액세스할 수 없음

Apache2 mod_rewrite URL 정리 - 작동하지만 파일에 액세스할 수 없음

서버: Debian Jessie Apache: 2.4.9-1 PHP: 5.5

내가 원하는 것은 파일이나 디렉터리가 아닌 모든 항목을 내가 직접 처리하는 index.php로 리디렉션하는 것입니다. 내 프로젝트의 특성상 가상 호스트 내에서 작업해야 합니다.

저는 작업 중인 웹 프로젝트에서 mod_rewrite와 함께 가상 호스팅(vHosts)을 사용하고 있습니다. vHost 파일은 다음과 같습니다.

<VirtualHost *:80>

        ServerName foo.com

        ServerAlias www.foo.com

        ServerAdmin [email protected]

        DocumentRoot /srv/foo/main/www/

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <IfModule mod_rewrite.c>

                RewriteEngine on

                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-d

                RewriteRule ^(.*)$ /index.php [L]

        </IfModule>

</VirtualHost>

vHost가 예상대로 작동하고 다시 쓰기 규칙이 예상대로 요청을 index.php로 리디렉션합니다. 그러나 서버의 파일에 액세스하려고 하면 다음과 같습니다.

foo.com/css/style.css

에 위치한:

/srv/foo/main/www/css/style.css

내 요청이 index.php로 리디렉션되었습니다.

재작성 조건문이 이 문제를 해결해야 한다는 점에서 이는 이상합니다.

모든 폴더 권한은 755로, 모든 파일 권한은 644로 설정됩니다.

재작성 조건이 일치하지 않아야 하는데 일치하는 것을 의심 없이 확인할 수 있었습니다. 나는 mod_rewrite에 대해 디버그 출력이 활성화된 Apache의 오류 로그를 보고 이를 확인할 수 있었습니다.

두 RewriteCond 문이 잘못 일치하는 이유는 무엇입니까?

아마도 vHost DocumentRoot가 표시되지 않습니까?

업데이트: 재작성 엔진을 끄면 테스트 중인 파일에 접근할 수 있습니다. IE, 내 URI가 정확합니다. 나는 내 길이 좋다는 것을 알고 있지만 어떤 이유로 든 조건이 실패하고 있습니다.

답변1

가상 호스트와 함께 Apache 2.4를 사용하고 vHost 내부의 파일이나 폴더를 확인해야 하는 재작성 조건을 사용하여 vHost 내부에서 mod_rewrite를 사용하려는 경우 재작성 조건을 수행하는 방법은 다음과 같습니다.

<VirtualHost *:80>

       <IfModule mod_rewrite.c>

                RewriteEngine on

                RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-f
                RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-d

                RewriteRule ^(.*)$ /index.php [L]

        </IfModule>

</VirtualHost>

나는 이것을 생각해 냈고 잘 작동하는 것 같습니다.

설명...

%{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI}상황에 맞는 문서 루트를 제공합니다. IE, 가상 호스팅이 적용된 후의 문서 루트입니다. 하지만 URI는 제공되지 않으므로 %{REQUEST_URI}작업을 완료하려면 을 추가해야 합니다.

CONTEXT_DOC_ROOT == /srv/foo/main/www

REQUEST_URI == /css/style.css

CONTEXT_DOC_ROOT + REQUEST_URI == /srv/foo/main/www/css/style.css

나머지는 쉽습니다. 멋진 소스. 도움이 되었기를 바랍니다!

관련 정보