디렉토리는 private
내 DocumentRoot 아래에 있으며 이름에도 불구하고 다른 디렉토리와 마찬가지로 액세스할 수 있어야 합니다. 하지만 RewriteRule
httpd.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
private
AFAIK라는 이름을 특별하게 만드는 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
포함되어 있지 않고 /foo
URL이 /private/2212.html
RewriteRule의 영향을 받지 않으므로 위의 패턴이 예상됩니다.
해결책은 플래그를 추가하는 것이 었습니다.[PT](통과)을 내 RewriteRule에 추가합니다.