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