Apache HTTPD 2.4.x: URL/URI에 특정 문자가 있는 경우 사용자를 사용자 정의 오류 페이지로 "지시"하는 방법은 무엇입니까?

Apache HTTPD 2.4.x: URL/URI에 특정 문자가 있는 경우 사용자를 사용자 정의 오류 페이지로 "지시"하는 방법은 무엇입니까?

그래서 사용자 정의 오류 페이지에 사용자를 "다시 작성"하려고 하는데 작동하지 않는 Apache 구성이 있습니다. 브라우저에 입력했는데 http://localhost/index.html/ddgdg%:sdsdfs오류 페이지가 표시되지 않았습니다.

브라우저( http://localhost/my-error.html)에 해당 URL을 직접 입력하면 사용자 정의 오류 페이지를 볼 수 있습니다.

내가 뭘 잘못하고 있는지 어떤 아이디어가 있습니까?


내 전체 httpd.conf:httpd.conf에 대한 링크


기본 httpd.conf에 대한 변경 사항(또한 mod_rewrite.so에 대한 LoadModule의 주석 처리를 제거해야 했습니다)

RewriteEngine On
LogLevel alert rewrite:info
#if invalid characters are present in the URI, display 404 page
RewriteCond %{REQUEST_URI} ^\/.+[:%].+  
RewriteRule "^/$" "http://%{SERVER_NAME}/my-error.html" [L,R=301]

사용자 정의 오류 페이지 내용

$ cat /Library/WebServer/Documents/my-error.html 
<html><body><h1>404 error here</h1></body></html>

아파치 버전

$ apachectl -v
Server version: Apache/2.4.34 (Unix)
Server built:   Feb 22 2019 20:20:11

편집1:현재 macOS Mojave를 실행 중이지만 잠시 후에 Ubuntu VM을 설정하게 됩니다.

답변1

여기에는 몇 가지 다른 문제가 발생하고 있습니다.

http://localhost/index.html/ddgdg%:sdsdfs

당신은 실제로 어떤 반응을 얻고 있는지 언급하지 않았습니다.일어나지 않는 일. 그러나 이탈 %(16진수로 인코딩된 옥텟 앞에 있지 않음)으로 인해 이 URL은 엄격히 유효하지 않으며 Apache가 400 Bad Request. 이를 재정의하는 유일한 방법은 요청된 URL을 확인하고 응답을 사용자 정의하는 사용자 정의 400 오류 문서를 만드는 것입니다. 예를 들어:

ErrorDocument 400 /my-error.html

길을 잃은 것이 아니라면 %mod_rewrite를 사용하여 이 요청을 포착하고 그에 따라 리디렉션할 수 있어야 합니다. 그러나 귀하는 RewriteRule빈 URL 경로(예: "^/$")를 확인하는 반면, 귀하의 예에서 요청한 URL은 비어 있지 않습니다(예: /index.html/ddgdg%:sdsdfs). 따라서 RewriteRule지시문은 귀하의 예 URL과 일치하지 않습니다. URL 경로의 위치 %를 ​​확인 하고 리디렉션하려면 다음과 같이 할 수 있습니다.:

# Checks for a "%" or ":" in the URL-path
RewriteRule [%:] /my-error.html [L,R=302]

그러나 URL 경로는 다음과 일치합니다.RewriteRule 무늬(서버 변수도 포함 REQUEST_URI)은 이미 %-디코드되어 있으므로 특수 문자가 이중으로 인코딩된 URL(드물게)에만 일치합니다. (위에서 언급했듯이, 그렇지 않으면 길을 잃은% 400 응답이 생성될 가능성이 높습니다.~ 전에mod_rewrite는 요청을 처리할 수 있습니다.)

my-error.html또한 사용자 정의 오류 문서(예: )로 "리디렉션"하고 직접 제공하지 않는 이유에 대해 질문하고 싶습니다. 리디렉션에는 클라이언트에 3xx 응답이 전송되고, 오류를 일으킨 URL에 관한 정보가 손실되고, 서버에 대한 요청이 두 배로 늘어나는 등 여러 가지 단점이 있습니다.

당신은 할 수내부적으로 다시 작성리디렉션 하는 /my-error.html대신 단순히 플래그를 제거하면 됩니다 R. 예를 들어:

RewriteRule [%:] /my-error.html [L]

그러나 HTTP 상태를 수동으로 설정하지 않으면 my-error.html사용자에게 200 OK응답이 표시됩니다. 이는 바람직하지 않습니다.

또는 (바람직하게는) 사용자 정의 404(하려는 작업과 유사한)를 생성하고 대신 이를 트리거합니다. 예를 들어:

ErrorDocument 404 /my-error.html

RewriteRule [%:] - [R=404]

그런 다음 Apache는 "404 Not Found" HTTP 응답 상태를 설정합니다.

그러나 여기서는 mod_rewrite를 전혀 사용할 필요가 없을 것입니다. 예제 URL에서 index.htmlURL 경로 뒤의 모든 항목, 즉 은( /ddgdg%:sdsdfs는)추가 경로 이름 정보(일명 경로 정보 / PATH_INFO). 기본적으로 text/html 응답을 처리하는 핸들러는 path-info를 허용하지 않으며 암시적으로 404를 트리거하여(위에서 설명한 대로 이탈이 아닌 경우 %) 사용자 정의 ErrorDocument(정의된 경우)를 호출합니다. 따라서 RewriteRule마지막 예의 지시어는 간단히 제거할 수 있습니다. Apache는 어쨌든 404를 트리거하기 때문입니다(이 동작을 로 재정의하지 않는 한 AcceptPathInfo).

관련 정보