Apache 2.4 .htaccess를 변환하고 vhost.conf로 다시 작성

Apache 2.4 .htaccess를 변환하고 vhost.conf로 다시 작성

이전 개발팀으로부터 받은 Apache 2.4 구성을 다시 작성하고 있습니다.

비슷한 구성이 ~200줄 있는데, 이 코드를 .htaccess가상 호스트로 이동하기 위해 어떤 원리로 변경해야 하는지 이해할 수 없습니다.

RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_URI} !^/application-module/(.*)$
RewriteCond %{REQUEST_URI} !(.*)json$ [NC]
RewriteCond %{REQUEST_URI} !playground/local-loader/(.*)$ [NC]
RewriteRule ^(.*)$ /$1/ [R,L,NC]

방금 가상 호스트로 옮기면 내 사이트가 내가 이해할 수 없는 곳에서 충돌합니다.

답변1

<VirtualHost>컨테이너에서 이러한 지시어를 배치하는 위치에 따라 다릅니다 .

컨테이너 <Directory>(예:예배 규칙서맥락) 및비활성화 .htaccess완전히 재정의하면(그렇지 않으면 컨테이너가 .htaccess재정의됩니다 <Directory>!) 지시문을 있는 그대로 복사할 수 있습니다( <Directory>컨테이너가 파일과 동일한 디렉터리를 참조한다고 가정 .htaccess).

그러나 이러한 지시어를 <VirtualHost>컨테이너 내부(컨테이너 외부 <Directory>)에 직접 배치하는 경우에는 다음과 같습니다. 안에가상호스트컨텍스트에 따라 몇 가지 변경이 필요합니다. 이는 요청이 파일 시스템에 매핑되기 전에 지시문이 더 일찍 처리되기 때문입니다.

게시한 지시문에서는 두 가지 변경 사항만 필요합니다.

  • 안에가상호스트컨텍스트에서 REQUEST_FILENAME서버 변수는 아직 확인되지 않았습니다.파일 이름. REQUEST_URI(즉, 요청된 URL) 과 동일합니다 . 따라서 파일 시스템 검사는 항상 실패하고 조건은 항상 성공합니다! 미리보기를 사용해야합니다. 예. %{LA-U:REQUEST_FILENAME}, 또는 절대 파일 이름을 직접 구성하십시오. 예. %{DOCUMENT_ROOT}%{REQUEST_URI}. 예를 들어:

    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
    
  • 안에가상호스트컨텍스트, 일치하는 URL 경로RewriteRule 무늬루트 상대입니다(슬래시로 시작). 반면에 파일 .htaccess이 포함된 디렉토리를 기준으로 하며 .htaccess슬래시 접두사는 적습니다. 따라서 작성된 규칙에 따라 URL 경로 시작 부분에 이중 슬래시가 표시되므로 대신 다음과 같이 다시 작성해야 합니다.

    RewriteRule ^/(.*)$ /$1/ [R,L]
    

    ( NC여기서는 플래그가 필요하지 않습니다.)

    또는 (바람직하게는) 여기서 역참조를 사용하지 말고 REQUEST_URI대신 서버 변수를 사용하십시오(자연스럽게 작동함 .htaccess). 예를 들어:

    RewriteRule ^ %{REQUEST_URI}/ [R,L]
    

    (곁에:이는 아마도 301 영구 리디렉션이어야 합니다(예: R=301). 현재로서는 기본적으로 302 임시 리디렉션으로 설정됩니다. 그러나 의도한 대로 작동하는지 확인한 후에만 301로 변경하십시오.)

따라서 요약하면 다음과 같습니다.

RewriteCond %{QUERY_STRING} ^$
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_URI} !^/application-module/(.*)$
RewriteCond %{REQUEST_URI} !(.*)json$ [NC]
RewriteCond %{REQUEST_URI} !playground/local-loader/(.*)$ [NC]
RewriteRule ^/(.*)$ /$1/ [R,L]

곁에:

위의 내용은 파일 시스템 검사를 이동하여 즉시 최적화할 수 있습니다(상대적으로값비싼)를 마지막 조건으로 이동하고상태요청이 이미 지시어에 대한 슬래시로 끝나지 않았는지 확인합니다 RewriteRule. 또한 정규식 하위 패턴(.*) 각 정규식 하위 패턴은정황필수는 아닙니다. 따라서 위의 내용을 보다 효율적으로 다시 작성할 수 있습니다.

RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_URI} !^/application-module/
RewriteCond %{REQUEST_URI} !json$ [NC]
RewriteCond %{REQUEST_URI} !playground/local-loader/ [NC]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule !/$ %{REQUEST_URI}/ [R,L]

파일 확장자가 포함된 요청을 제외하는 경우 파일 시스템 검사를 완전히 제거할 수도 있지만 이는 파일 구조에 따라 달라질 수 있습니다.

그만큼상태그 검사는 !json$실제로 파일 확장자를 검사해야 하는 것처럼 보입니다 .json.!\.json$ . (이것은 제외에 대한 위의 내 의견과 관련이 있습니다.모두"파일 확장자"가 있는 요청입니다.)

첫번째상태쿼리 문자열이 비어 있는지 확인하는 것은 약간 이상해 보이지만(URL 경로에 슬래시를 추가할 때 쿼리 문자열이 있는지 여부는 실제로 중요하지 않기 때문에) 이것이 특정 요구 사항이어야 한다고 가정합니까?

관련 정보