URL의 특수 문자로 인해 맞춤 리디렉션이 실패함

URL의 특수 문자로 인해 맞춤 리디렉션이 실패함

오류 페이지에 대한 사용자 정의 리디렉션을 설정하려는 도메인이 있습니다.
.htaccess파일은 다음과 같습니다

RewriteEngine On
AddDefaultCharset UTF-8
DefaultLanguage en-US
# disable TRACK and TRACE http methods. 'RewriteEngine On' is required!
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS|HEAD|PUT|DELETE)
RewriteRule .* - [F]
Options All -Indexes
ServerSignature Off
<ifModule mod_headers.c>
        Header unset X-Powered-By
</ifModule>
<Files .htaccess>
order allow,deny
deny from all
</Files>
<IfModule php5_module>
        php_value session.cookie_httponly true
        #php_value session.cookie_secure true
</IfModule>
RewriteCond %{QUERY_STRING} _escaped_fragment_=(.*)
#to block all links to '.gif', '.jpg','.js' and '.css'  files which are not from the domain name 'http://www.example.com/'
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example.com/.*$ [NC]
RewriteRule \.(gif|jpg|css|js)$ - [F]
#to deny requests containing invalid characters
RewriteBase /
RewriteCond %{THE_REQUEST} !^[A-Z]{3,9}\ [a-zA-Z0-9\.\+_/\-\?\=\&]+\ HTTP/ [NC]
RewriteRule .* - [F,NS,L]

# Secure directories by disabling execution of scripts
AddHandler .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI


#Error page handeller
ErrorDocument 400 /htaccessSample/errordocs/error-code.php
ErrorDocument 401 /htaccessSample/errordocs/error-code.php
ErrorDocument 403 /htaccessSample/errordocs/error-code.php
ErrorDocument 404 /htaccessSample/errordocs/error-code.php

URL에 다음과 같은 내용을 입력하면:

  • example.com/aboutUs: 모든 것이 정상적으로 작동합니다.
  • example.com/xxygsds: URL이 사용자 정의 404 오류 페이지로 리디렉션됩니다.
  • example.com/<>: 403 금지 페이지로 리디렉션됩니다. 그러나 apache/error/HTTP_FORBIDDEN.html.var위에서 언급한 대로 리디렉션은 사용자 정의 페이지가 아닌 페이지로 리디렉션됩니다 .

내 질문:
1. 이러한 리디렉션이 발생하는 이유는 무엇입니까?
2. 모든 조건에서 사용자 정의 403 오류 페이지로 리디렉션되도록 하려면 어떻게 해야 합니까?

답변1

왜 그렇게 하는지 잘 모르겠습니다. 내 403 페이지에서도 동일한 문제가 발생했습니다. 특정 403 페이지를 리디렉션하려면 다음을 사용하세요.

<Files some_thing> 
order Deny,Allow 
Deny from all 
</Files>

답변2

오류 문서 위치를 .htaccess 파일의 맨 위로 이동해 보세요. 나는 무슨 일이 일어나고 있는지 알아보기 위해 잠시 동안 귀하의 예를 살펴본 후 마침내 이 경우 종료할 위치를 알려주기 전에 종료하라는 지시를 받고 있다는 것을 깨달았습니다.

Apache는 지시문을 순서대로 읽고 L 케이스에서 종료됩니다. L은 F에 내재되어 있습니다.

[F]를 사용하면 [L]이 암시됩니다. 즉, 응답이 즉시 반환되고 추가 규칙이 평가되지 않습니다. https://httpd.apache.org/docs/2.4/rewrite/flags.html

그래서 나는 아파치가 <> 예제와 일치하는 실제 사례에 도달할 때 해당 지침 세트에 결코 도달하지 못할 것이라고 추측합니다. 그런 다음 해당 선언에 도달하기 전에 종료되었으므로 페이지를 기본 Apache 403 오류 페이지로 보냅니다. 귀하의 404는 L 조건, 즉 마지막으로 실행되는 규칙을 포함하는 규칙을 트리거하지 않아 htaccess 규칙의 맨 아래에 도달했기 때문에 작동했습니다.

나는 습관적으로 php ini 조정 등과 같은 다른 핵심 사항과 함께 기본 오류 페이지를 지시문의 맨 위에 항상 배치하기 때문에 이런 상황에 처한 적이 없습니다.

다시 쓴 내용은 맨 아래에 있습니다.

목표는 재작성을 위해 L 케이스에 도달하거나 htacess/config 규칙이 끝날 때까지 아파치에게 알리고 싶은 모든 것이 아파치에 전달된다는 것입니다. htaccess가 아니었다면 apache는 사이트 제공을 시작할 때 모든 규칙을 알고 있었을 것입니다. 그러나 htacess를 사용하면 단지 규칙을 읽고 파일이 지시하는 대로 수행한다고 믿습니다.

나는 이것이 옳다고 생각하지만 100% 확신할 수는 없습니다. 왜냐하면 나는 항상 맨 위에 있어야 할 것을 맨 위에 올려 놓았고 따라서 귀하의 사건을 유발한 적이 없기 때문입니다. 핵심은 L, Last가 실제로 Last를 의미한다는 것을 깨닫고 F가 L을 의미한다는 것도 아는 것입니다.

일반적으로 Apache 구성을 다룰 때는 체계적으로 구성하는 것이 좋습니다.

# top generics etc
#Error page handler
ErrorDocument 400 /htaccessSample/errordocs/error-code.php
ErrorDocument 401 /htaccessSample/errordocs/error-code.php
ErrorDocument 403 /htaccessSample/errordocs/error-code.php
ErrorDocument 404 /htaccessSample/errordocs/error-code.php

AddDefaultCharset UTF-8
DefaultLanguage en-US
# Disable Directory Browsing, not related to rewrite
Options All -Indexes

# Secure directories by disabling execution of scripts
AddHandler .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI

ServerSignature Off
<ifModule mod_headers.c>
        Header unset X-Powered-By
</ifModule>

<IfModule php5_module>
        php_value session.cookie_httponly true
        #php_value session.cookie_secure true
</IfModule>

<Files .htaccess>
order allow,deny
deny from all
</Files>

## NOW do the set of rewrite rules, everything that apache needs to 
## know has been told to it by this point
RewriteEngine On
# disable TRACK and TRACE http methods. 'RewriteEngine On' is required!
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS|HEAD|PUT|DELETE)
RewriteRule .* - [F]

RewriteCond %{QUERY_STRING} _escaped_fragment_=(.*)
#to block all links to '.gif', '.jpg','.js' and '.css'  files which are not from the domain name 'http://www.example.com/'
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example.com/.*$ [NC]
RewriteRule \.(gif|jpg|css|js)$ - [F]
#to deny requests containing invalid characters
RewriteBase /
RewriteCond %{THE_REQUEST} !^[A-Z]{3,9}\ [a-zA-Z0-9\.\+_/\-\?\=\&]+\ HTTP/ [NC]
RewriteRule .* - [F,NS,L]

.htaccess 파일 끝에 항상 개행/줄바꿈을 추가하는 것을 잊지 마세요. 귀하의 버전은 극도로 무작위적이고 체계적이지 않습니다. 이것이 제 생각에는 귀하의 문제에 대한 실제 원인입니다. 단순히 규칙을 명확하고 일관되게 정렬하는 데 익숙해지면(즉, 재작성이 다른 규칙과 혼합되지 않음) 찾을 수 있을 것입니다. 일반적으로 아파치로 작업하는 것이 훨씬 쉽습니다.

관련 정보