다른 URI에서 특정 재작성을 수행하는 htaccess 파일

다른 URI에서 특정 재작성을 수행하는 htaccess 파일

.htaccess내 파일 에는 다음이 있습니다 .

<IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine On

    # Block hidden directories
    RewriteRule "(^|/)\." - [F]

    # Prevent /health_check.php from using https
    RewriteCond %{REQUEST_URI} !(health_check\.php)$

    # Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
    RewriteCond %{REQUEST_URI} !^/(sns)/

    # Reroute http to https
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

    # Prevent rewriting of domain for codeigniter
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

</IfModule>

부분 빼고는 다 괜찮은 것 같습니다 /sns. https로의 리디렉션을 중지할 수 없습니다.

https로 리디렉션하지 않고 http://sub.example.com/sns싶습니다 .http://sub.example.com/health_check.php

답변1

# Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
RewriteCond %{REQUEST_URI} !^/(sns)/

요청 URL이 (설명된 대로) 후행 슬래시로 끝나지 않으면 위의 규칙(후행 슬래시 포함)이 적용됩니다.조건 패턴)는 항상 성공할 것입니다(그것은부정하다조건)이므로 HTTPS로의 리디렉션이 항상 발생합니다.

이상적으로는 요청 초기에 후행 슬래시를 정규화해야 합니다. 후행 슬래시를 포함할지 여부(그렇지 않으면 본질적으로중복 콘텐츠URL을 구문 분석하는 다른 스크립트에 잠재적으로 문제가 발생할 수 있습니다.

/sns그러나 두 URL을 처리하려면 /sns/후행 슬래시를 선택 사항으로 만들고 문자열 끝 앵커( ^)를 포함해야 합니다. 예를 들어:

RewriteCond %{REQUEST_URI} !^/sns/?$

이는 명시된 두 URL과만 일치합니다. 형식의 URL과 일치하지 않습니다 /sns/<something>.

경로 세그먼트 주위의 괄호를 제거했습니다(정규식에서 다른 괄호도 제거해야 함). 이렇게 하면 캡처된 그룹이 생성되며 게시한 지시문에서는 불필요합니다.

업데이트:또한 다시 작성된 URL(예: )이 리디렉션되지 않는지 추가로 확인해야 합니다 /index.php/sns. 추가 조건을 포함하여 재작성된 요청이 아닌 초기 요청에만 HTTPS 리디렉션을 적용함으로써 보다 일반적인 방법으로 이 작업을 수행할 수 있습니다.

# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$

환경 REDIRECT_STATUS변수는 첫 번째 성공적인 재작성(즉, CodeIgniter 라우팅) 후에 "200"으로 설정됩니다. 초기 요청에는 설정되지 않습니다(예: ^$빈 문자열).

그래도 리디렉션이 발생하면 CodeIgniter 자체가 리디렉션을 트리거할 가능성이 있습니다( .htaccess처리된 후).

RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

곁에:./그리고 내 의견에서 언급 했듯이RewriteRule 대체. 참조내 대답 끝~에이 StackOverflow 질문설명을 위해.

요약

Options +FollowSymlinks
RewriteEngine On

# Block hidden directories
RewriteRule ^\. - [F]

# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$

# Prevent /health_check.php from using https
RewriteCond %{REQUEST_URI} !health_check\.php$

# Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
RewriteCond %{REQUEST_URI} !^/sns/?$

# Reroute http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Prevent rewriting of domain for codeigniter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

HTTP에서 HTTPS로의 리디렉션은 궁극적으로 301(영구) 리디렉션이어야 하지만 제대로 작동하는지 확인한 후에만 가능합니다. 플래그 R자체의 기본값은 302(임시) 리디렉션입니다.

<IfModule>( 사이트가 mod_rewrite 없이 작동하도록 의도되지 않는 한 래퍼도 필요하지 않습니까 ?)

관련 정보