Apache에서는 "개인" 디렉터리에 접근할 수 없습니다.

Apache에서는 "개인" 디렉터리에 접근할 수 없습니다.

디렉토리는 private내 DocumentRoot 아래에 있으며 이름에도 불구하고 다른 디렉토리와 마찬가지로 액세스할 수 있어야 합니다. 하지만 RewriteRulehttpd.conf에 다음을 추가하면 :

RewriteRule ^/([^\.]+)$ /$1.html [L]

Apache는 다음에 대해 403을 반환합니다.http://서버/비공개/2201. 오류 로그 상태

client denied by server configuration: /private/2201.html

private그런 다음 이름을 로 바꾸 foo거나 2201.html을 직접 요청하면 파일이 제공됩니다.

127.0.0.1 - - [21/Nov/2011:10:24:45 +0100] "GET /private/2201 HTTP/1.1" 403 214
127.0.0.1 - - [21/Nov/2011:10:24:58 +0100] "GET /foo/2201 HTTP/1.1" 200 3068
127.0.0.1 - - [21/Nov/2011:10:27:39 +0100] "GET /private/2201.html HTTP/1.1" 200 3068

이것은 혼란스럽다. 라는 이름의 디렉토리에 대한 특별한 규칙이 있습니까 private? 그렇다면 2201.html에 대한 직접 요청이 작동하는 이유는 무엇입니까(적어도 오류 로그 항목에 따르면 거부된 요청이 동일한 리소스를 처리하는 것처럼 보이지만)?

답변1

privateAFAIK라는 이름을 특별하게 만드는 Apache 또는 mod_rewrite에는 아무것도 내장되어 있지 않습니다 . 그러나 해당 이름을 다르게 처리하는 기본 규칙이 구성에 포함되어 있을 수 있습니다. 예를 들어 단어에 대한 구성을 파악해 보십시오 private.

grep private /etc/httpd/httpd.conf  # RedHat, CentOS
grep -r private /etc/apache2        # Debian, Ubuntu, etc.

일치하는 RewriteRule을 찾으면 그것이 범인입니다.

로그 항목을 보면 특히 문제를 일으키는 이름 private과 요청 거부를 일으키는 RewriteRule임이 분명해집니다.

답변2

이것은 RTM의 당황스러운 사례입니다. Apache의 문서에 관한RewriteRule적어도 RewriteRule을 정의할 때 대체 문자열은 "www라는 디렉터리가 루트나 파일 시스템에 존재하지 않는 한 URL 경로로 처리되며, 이 경우 파일 시스템 경로로 처리됩니다"라고 명시적으로 명시합니다. 디렉토리 컨텍스트 외부.

내 파일 시스템에는 이 포함되어 있지만 /private포함되어 있지 않고 /fooURL이 /private/2212.htmlRewriteRule의 영향을 받지 않으므로 위의 패턴이 예상됩니다.

해결책은 플래그를 추가하는 것이 었습니다.[PT](통과)을 내 RewriteRule에 추가합니다.

관련 정보