.htaccess URL 재작성 및 https 강제 실행

.htaccess URL 재작성 및 https 강제 실행

사이트: example.com

Joomla 하위 디렉터리: example.com/joomla

example.com/joomla의 Joomla 설치가 사이트의 루트가 되기를 원합니다., 즉 example.com을 방문하는 사람들은 example.com/joompla/index.php로 리디렉션되지만 URL 표시줄에는 여전히 example.com이 표시됩니다.또한 이 기회를 이용하여 들어오는 모든 연결이 HTTPS를 사용하도록 강제하고 싶습니다.. 온라인에서 찾은 스크립트를 사용하여 둘 중 하나를 수행할 수 있었지만 둘 다 일관성을 유지하지는 못했습니다.

.htaccess에 대해 지금까지 얻은 내용은 다음과 같습니다.

RewriteEngine on
RewriteBase /

# Rewrites all URLS without joomla in them
RewriteCond %{REQUEST_URI} !^/joomla/

# Rewrites all URLS with example in them
RewriteCond %{HTTP_HOST} ^(www\.)?example\.

# Rewrite all those to insert /joomla
RewriteRule ^(.*)$ /joomla/$1 [L]

# This works SOME of the time to redirect to https
Header always set Content-Security-Policy "upgrade-insecure-requests;"

# If a request tries to access /joomla directly, redirect it to its secured canonical version
RewriteCond %{THE_REQUEST} joomla/
RewriteRule ^joomla/(.*) http://example.com/$1 [R=301,L]

이것은 Chrome에서 Joomla 설치로 리디렉션하고 https로 전환하여 한동안 작동하는 것처럼 보이지만 때로는 거기에 도달하기 위해 반복적으로 강제로 다시 로드해야 합니다. Firefox에서는 절대 작동하지 않으며 사이트가 전혀 로드되는 드문 경우에도 http에 유지됩니다.

저는 .htaccess를 처음 접했고 위 문제에 대한 가장 훌륭하고 포괄적인 솔루션을 개발했는지 확신할 수 없습니다. 다양한 명령을 사용 RewriteCond %{HTTPS} !=on하거나 RewriteCond %{SERVER_PORT} 80함께 사용하는 다른 예제를 온라인에서 보았지만 RewriteRule이러한 명령을 기존 URL 재작성 조건과 결합하는 방법을 잘 모르므로 결과적으로 주변 시나리오가 누락되었다고 확신합니다.

경험이 더 많은 사람이 이 과정을 안내해 줄 수 있나요? 정말 감사하겠습니다. 나는 며칠 동안 온라인에서 찾은 다양한 스크립트를 시도해 보았지만 마법의 단어를 찾지 못했습니다.

답변1

기존 지시어에 관한 몇 가지 참고 사항:

재작성베이스 /

을 정의했지만 RewriteBase어떤 지시문에서도 사용되지 않습니다. 상대 RewriteBase경로에만 적용됩니다.대체품(관련 지시문에서 루트 상대 URL 경로를 명시적으로 사용했습니다).

# Rewrites all URLS with example in them
RewriteCond %{HTTP_HOST} ^(www\.)?example\.

당신은 ~필요요청한 호스트 이름을 확인하려면? 이 규칙을 적용하지 않으려는 여러 도메인(또는 하위 도메인)을 호스팅하지 않는 한상태불필요합니다.

# This works SOME of the time to redirect to https
Header always set Content-Security-Policy "upgrade-insecure-requests;"

이것절대"리디렉션"을 트리거하므로 네트워크 트래픽에서 무엇을 보고 있는지 잘 모르겠습니다.

(실제로 게시한 코드에는 HTTP에서 HTTPS로 "리디렉션"을 트리거하는 내용이 없습니다.)

이 HTTP 응답 헤더는 브라우저가 다음에 대한 모든 요청을 자동으로 "업그레이드"하도록 합니다.연결된 리소스(CSS, JS, 이미지, 외부 리소스 등)을 HTTP(예: 실제 URL에 포함되어 있기 때문에)를 통해 수행되는 초기 HTML(페이지) 응답에서 http://...HTTPS를 통해 수행합니다. 실제 "리디렉션"은 발생하지 않습니다. 그리고 일반 HTTP를 통해 전달되었을 수 있는 초기 HTML 응답에서는 아무 일도 일어나지 않습니다.

사이트 전체 HTTP에서 HTTPS로 리디렉션을 구현했고 연결된 모든 리소스가 이미 HTTPS이거나 루트 상대(또는 프로토콜 상대) URL을 사용하는 경우에는 이 헤더가 반드시 필요하지 않습니다. 그러나 그것은 좋은 안전망을 제공합니다. 그러나 HTTPS를 지원하지 않는 연결된 리소스는 모두 중단되며 사용자에게 브라우저 경고가 표시되지 않습니다. 이 헤더가 없으면 사용자는 잠재적으로 브라우저 "혼합 콘텐츠" 경고를 받게 됩니다(링크된 리소스가 실패함).

# If a request tries to access /joomla directly, redirect it to its secured canonical version
RewriteCond %{THE_REQUEST} joomla/
RewriteRule ^joomla/(.*) http://example.com/$1 [R=301,L]

지시문 RewriteCond("정상 조건"에서 리디렉션 루프를 방지하는 데 사용됨)은 joomla/요청된 URL의 어느 곳에서나 일치합니다. 쿼리 문자열에서도 마찬가지입니다. 이는 올바르지 않으며 joomla/URL 경로의 다른 곳에 나타나거나 심지어는 잘못된 리디렉션이 발생할 수 있습니다. 쿼리 문자열. 예를 들어 단순히 ?joomla/URL 끝에 추가하면 리디렉션 루프가 발생합니다 .

이 "리디렉션"은 가야합니다~ 전에내부가 다시 작성됩니다. 일반적으로 재작성된 URL을 리디렉션하고 재작성된 URL이 사용자에게 노출되는 것을 방지하려면 "리디렉션"이 "재작성"보다 먼저 이루어져야 합니다.

주석에서 언급했듯이 이 리디렉션은 HTTP로의 리디렉션입니다. 이는 수행하려는 작업과 반대입니다(HTTP에서 HTTPS로 리디렉션을 구현할 때 작은 리디렉션 체인이 생성됩니다).

몇 가지 가정:

  • SSL 인증서는 애플리케이션 서버에 직접 설치됩니다. Cloudflare(Flexible-SSL) 또는 SSL을 관리하는 기타 프런트 엔드 프록시가 없습니다.
  • 다른 하위 도메인을 사용하지 않습니다. 단지 www.
  • 정식 호스트 이름은 www가 아닙니다. example.com(귀하의 질문에 대한 리디렉션에서).
  • 현재는 HSTS를 구현하지 않으므로 example.com단일 리디렉션으로 HTTPS 및 정식 호스트 이름(예: )으로 리디렉션할 수 있습니다.
  • /joomlaJoomla 자체는 이미 URL에서 하위 디렉터리를 생략하도록 구성되었습니다 . /joomla정적 리소스(CSS, JS, 이미지 등)에 대한 링크를 포함한 내부 링크에는 존재하지 않습니다.
  • 문서 루트의 파일을 제공하지 않습니다.모든 것하위 디렉토리 로 이동하는 것입니다 /joomla.

.htaccess시나리오 #1 - 문서 루트에 단일 파일이 있습니다.

(댓글에 명시되어 있듯이.)

이 시나리오에서는 URL을 Joomla 전면 컨트롤러(예: )로 라우팅하는 .htaccess설치 하위 디렉터리( )에 "Joomla" 파일이 없습니다 . 이 경우 URL에 이 있어야 하며 Joomla의 "SEF" URL을 사용할 수 없습니다./joomlaindex.phpindex.php

루트 /.htaccess파일은 다음과 같습니다.

RewriteEngine on

RewriteBase /joomla

# If a request tries to access /joomla directly, redirect it to its secured canonical 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,7}\s/joomla
RewriteRule ^joomla(?:$|/(.*)) https://example.com/$1 [R=302,L]

# Canonicalise the hostname - ie. www to non-www and HTTPS
RewriteCond %{HTTP_HOST} ^www\.(.+?)\.?$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=302,L]

# Redirect remaining requests from HTTP to HTTPS
# The hostname must already be canonical at this point
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]

# Rewrite everything to the /joomla subdirectory
# Uses the value defined in the RewriteBase directive above
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) $1 [L]

# Ensure that any linked resources are requested over HTTPS
Header always set Content-Security-Policy "upgrade-insecure-requests;"

여기서는 테스트 목적으로 302(임시) 리디렉션을 사용했습니다. 항상 302 리디렉션으로 먼저 테스트하고 정상적으로 작동하는 것으로 확인된 후에만 301(영구)로 변경하십시오. 301은 브라우저에 의해 지속적으로 캐시되므로 테스트에 문제가 발생할 수 있습니다.

환경 변수는 첫 번째 규칙에서 사용된 것과 REDIRECT_STATUS거의 동일한 방식으로 요청을 다시 작성하지 않고 직접 요청만 다시 작성하도록 하는 데 사용됩니다 . 초기 요청에서는 비어 있으며 첫 번째 성공적인 재작성 후 "200"(200 OK HTTP 응답 상태에서와 같이)으로 설정됩니다. 지시어는 처음에는 약간 이상해 보일 수 있지만(자체적으로 다시 쓰는 것처럼 보임) 결과 대체 항목 앞에는 이 붙으므로 실제로는 에 다시 씁니다 .THE_REQUESTREDIRECT_STATUSRewriteRule (.*) $1 [L]RewriteBase/joomla/<url>

시나리오 #2 - 두 개의 .htaccess파일: 문서 루트 및 하위 디렉터리

.htaccess하위 디렉토리 의 파일은 Joomla 와 함께 제공되는 /joomla합리적인 표준 .htaccess파일입니다. 이는 모든 요청을 Joomla 전면 컨트롤러(예: index.php)로 라우팅하고 Joomla의 "SEF" URL을 사용할 수 있도록 합니다(즉, index.phpURL에 명시적으로 포함할 필요가 없습니다).

루트 /.htaccess파일은 다음과 같습니다.

RewriteEngine on

RewriteBase /joomla

# Canonicalise the hostname - ie. www to non-www and HTTPS
RewriteCond %{HTTP_HOST} ^www\.(.+?)\.?$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=302,L]

# Redirect remaining requests from HTTP to HTTPS
# The hostname must already be canonical at this point
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]

# Rewrite everything to the /joomla subdirectory
# Uses the value defined in the RewriteBase directive above
RewriteRule (.*) $1 [L]

# Ensure that any linked resources are requested over HTTPS
Header always set Content-Security-Policy "upgrade-insecure-requests;"

URL에서 하위 디렉터리를 제거하기 위한 리디렉션이 /joomla제거되었으며 파일로 이동해야 합니다 /joomla/.htaccess. (여기에 놔두면 전혀 불필요한 내용이 됩니다.)

REDIRECT_STATUS이번에는 env var 에 대한 확인이 필요하지 않습니다 /joomla/.htaccess.잡다요청이 다시 작성된 후입니다. (mod_rewrite 상속이 활성화되지 않았다고 가정합니다.)

원하는 경우 지시어를 로 이동할 수 있습니다. 어쨌든 "상속"되므로 이는 선택 사항 입니다 Header./joomla/.htaccess

그러면 /joomla/.htaccess파일에는 다음과 같은 내용이 포함됩니다.

# JOOMLA: Set Options here

RewriteEngine on

# If a request tries to access here directly then redirect back to root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) https://example.com/$1 [R=302,L]

# JOOMLA: Rewrite rules to block out some common exploits.
# :

# Leave the RewriteBase directive commented out - it's not required
#RewriteBase /joomla

## Begin - Joomla! core SEF Section.
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
## End - Joomla! core SEF Section.

파일 /joomla/.htaccess은 다음을 대략적으로 기반으로 합니다.Joomla 웹사이트의 코드그러나 공통 요소/주석을 생략하고 "SEF 섹션"을 하위 디렉터리와 관련되도록 변경했습니다. (Joomla는 또한 .*단순히 . 대신 덜 효율적인 정규식을 사용합니다 ^.)

관련 정보