2009-10-28 4 views
0

이것은 매우 이상한 문제이며 명확하게 설명 할 수 있기를 바랍니다.모든 규칙에 대해 htaccess 다시 쓰기가 작동하지 않음

는 기본적으로, 우리는 ... 그래서, 우리는 원래 같은 일이 있었다 곳

오늘 클라이언트 사이트에서 주요 업데이트를 만든 등 새로운 구조를 수용하기 위해 htaccess로 약간의 재 작성 규칙을 업데이트 할 필요 :

RewriteRule ^/resources/?$ index.php?id=resources 
RewriteRule ^/media/?$  media.php 

우리는 변경 :

RewriteRule ^/resources/?$ index.php?id=resources 
RewriteRule ^/media/?$  index.php?id=media 

그러나 우리는 http://www.example.com/media를 방문했을 때 - 그것은 기존의 미디어 페이지를 표시했다. 그런 다음 문서 루트에서 이전 media.php를 제거하면 404가됩니다. 어딘가에 여전히/media를 media.php에 매핑하고 다시 쓰기 규칙을 무시하고 있습니다.

이상한 일은 - 파일의 다른 모든 다시 쓰기 규칙이 정상적으로 작동하고 있으며 거기에 약 20 정도가 있습니다.

우리는 가상 호스트와 다른 설정 파일을 추적했지만 미디어 나 다른 리디렉션 (세 개가 합계)에 대한 참조를 찾을 수 없으므로 우리는 혼란 스럽습니다.

+0

웹 서버를 다시 시작 했습니까? – Gumbo

+0

예, 우리는 그렇게했습니다 - 일반적으로 디렉토리 레벨 htaccess에 영향을 미치지 않아야합니다 (그렇지 않습니다) – HorusKol

+0

그러나 .htaccess 파일에서 mod_rewrite를 사용하면 디렉토리 당 경로 접두어가 요청 URI에서 제거되므로 패턴에서 제거 할 수 있습니다. 따라서 주어진 규칙은 .htaccess 파일에서 전혀 작동하지 않아야합니다. – Gumbo

답변

1

.htaccess 사이트에서 MultiViews 옵션을 사용하지 않으면 문제가 해결되었습니다. 다시 쓰기 규칙 전에 처리되는 콘텐츠 협상을 사용하는 것으로 보입니다.

2

필자는 이것이 나의 관점에서 Apache의 잘못된 기능인 AcceptPathInfo 때문인 것으로 의심됩니다. 기본적으로 PHP가 핸들러 인 곳에서 스위치가 켜져 있다고 믿습니다.

에 한번 당신의 .htaccess에 추가하거나 바람직하게하려면 httpd.conf (다시 시작) :

AcceptPathInfo Off 

참조 : http://httpd.apache.org/docs/2.2/mod/core.html#acceptpathinfo

-

몇 가지 측면 포인트 :

일치하는 항목을 찾으면 RewriteRules가 항상 [L]로 끝나야합니다. 디버깅에 도움이됩니다. 예 :

RewriteRule ^/media/?$  index.php?id=media [L] 

또한 유사한 규칙을 조합하여 규칙 수를 줄일 수 있습니다. 예 :

RewriteRule ^/(media|resources)/?$ index.php?id=$1 [L] 

개인적으로는 /? 첫 번째 절반이 끝나면 리디렉션없이 두 URL이 작동한다는 의미이므로 '올바른'최종 URL이 없다는 의미입니다. 개인적으로 다음을 사용합니다.

RewriteRule ^/(media|resources)/$ index.php?id=$1 [L] 
RewriteRule ^/(media|resources)$ /$1/ [L,R] 

즉, 고유 한 리소스에는 정식 (최종) URL이 하나 있어야합니다.

+0

불행하게도 이것은 유감스럽게도 고대 유산 사이트이며 지금까지 나는 이전 개발자가 제시 한 스키마 ("아직 해결하지 못했습니다"접근 방식). 그러나 문제는 MultiViews가 활성화되었음을 나타냅니다 ... 이제는 비활성화하는 것이 안전한지 알아야합니다. – HorusKol

관련 문제