약 255자 URL 제한을 얻기 위해 {REQUEST_FILENAME}을 피하기 위해 mod_rewrite를 변경하는 방법은 무엇입니까?

약 255자 URL 제한을 얻기 위해 {REQUEST_FILENAME}을 피하기 위해 mod_rewrite를 변경하는 방법은 무엇입니까?

이 답변에 따르면:mod_rewrite의 URL 최대 길이는 257자입니까?mod_rewrite를 사용하기 위한 파일 시스템에 따라 최대 255자 하드 제한이 있습니다.

허용되는 답변에 따르면 두 가지 솔루션이 있습니다.

  1. 애플리케이션의 URL 형식을 각 슬래시 사이에 최대 255자로 변경하세요.
  2. 재작성 규칙을 Apache 가상 호스트 구성으로 이동하고 REQUEST_FILENAME을 제거합니다.

첫 번째 방법을 사용할 수 없어서 두 번째 방법을 알아내려고 합니다.

요청에 따라 Apache 가상 호스트 구성에 다시 쓰기 규칙을 넣었습니다. 그러나 REQUEST_FILENAME을 제거하고 웹 애플리케이션 프레임워크(Dragonfly)가 계속 작동하는 방법을 알 수 없습니다.

다음은 .htaccess에서 Apache의 가상 호스트 구성 파일로 옮긴 다시 쓰기 규칙의 일부입니다.

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f [OR]

# if don't want Dragonfly to process html files comment
# out the line below (you may need to remove the [OR] above too).
RewriteCond %{REQUEST_FILENAME} \.(html|nl)$

# Main URL rewriting.
RewriteRule (.*) index.cgi?$1 [L,QSA]

{REQUEST_FILENAME}을 제거하려고 시도했는데 다양한 방식으로 프레임워크가 중단되었습니다. {REQUEST_FILENAME}을 사용하지 않고 어떻게 다시 작성하나요?

답변1

아래 세 줄은 Apache에게 파일 시스템을 검사하여 파일이 존재하는지 확인하도록 지시합니다.

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f [OR]

첫 번째는 "URI가 디렉토리가 아닌 경우"를 의미합니다. 두 번째는 "URI가 링크가 아닌 경우"를 의미합니다. 세 번째는 "URI가 파일이 아닌 경우"를 의미합니다.

해당 줄을 제거하거나 주석 처리하면 Apache는 ".html" 또는 ".nl"로 끝나지 않는 모든 파일에 아래 재작성을 적용하고 파일이 먼저 존재하는지 확인하기 위해 파일 시스템을 확인하지 않습니다.

위의 세 줄에는 목적이 있습니다. 실제 파일, 디렉토리 또는 심볼릭 링크를 문서 루트에 추가하고 누군가 해당 파일, 디렉토리 또는 심볼릭 링크를 요청하면 Apache는 이를 정상적으로 처리하고 다시 작성하지 않도록 하기 위해 존재합니다. 문서 루트에 실제 파일을 추가하지 않을 것이라는 점을 알고 있다면 부작용 없이 해당 파일을 안전하게 주석 처리할 수 있습니다.


잠재적으로 더 나은 변경은 다음과 같이 세 줄 위에 새 규칙을 추가하는 것입니다.

RewriteRule (.*[^/]{255}.*) index.cgi?$1 [L,QSA]

이렇게 하면 슬래시 사이에 255자 이상의 단일 문자열이 있는 모든 URI를 가로채서 파일 시스템을 확인하지 않고 바로 다시 쓰기로 보냅니다. [L] 옵션은 Apache가 이 규칙과 일치하는 경우 더 이상 규칙을 확인하지 않도록 합니다. 이 정규식과 일치하는 URI는 유효한 파일 경로가 아니기 때문에 실제 파일에 매핑된 URI를 가로챌 위험이 없습니다.

업데이트:

길이가 255자 이상인 모든 URI와 일치하는 정규식입니다.

RewriteRule (.{255}) index.cgi?$1 [L,QSA]

답변2

다음은 저에게 효과적입니다(아파치 2.2.21을 사용하는 데비안의 기본 가상 호스트에서 테스트됨).

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} (.{255}) [OR]
RewriteCond %{REQUEST_FILENAME} \.(html|nl)$ [OR]
RewriteCond %{REQUEST_FILENAME} !-d [OR]
RewriteCond %{REQUEST_FILENAME} !-l [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /index.cgi?$1 [L,QSA]

관련 정보