
URL을 다시 작성해야 합니다.
us.example.com
에게
example.com?country=us
하위 도메인 없이
나는 다음 두 가지 규칙을 시도했습니다.
1.
RewriteRule (US|EG) ?c=$1 [NC , L]
2.
RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]
하지만 그들은 작동하지 않았습니다.
그래서 .. 이것을 할 수 있는 방법이 있나요?
답변1
다른 호스트 이름에 걸쳐 URL을 "다시 쓸" 수 없으며(역방향 프록시를 구현해야 함) "리디렉션"은 바람직하지 않다고 가정합니다.
그러나 하위 도메인과 기본 도메인이 모두 파일 시스템의 동일한 영역을 가리키는 경우 호스트 이름/도메인을 변경할 필요가 없습니다. (동일한 호스트에서) 일반적인 재작성이 필요한 전부입니다.
요청된 호스트에서 하위 도메인을 확인하려면 서버 변수(즉, HTTP 요청 헤더 의 값 )를 RewriteCond
확인하는 조건(지시문)이 필요합니다 . 그만큼HTTP_HOST
Host
RewriteRule
무늬URL의 URL 경로 부분과만 일치합니다.
예를 들어:
RewriteEngine On
RewriteCond %{QUERY_STRING} !^country=
RewriteCond %{HTTP_HOST} ^(us|eg)\.example\.com [NC]
RewriteRule ^ /?country=%1 [L]
위에서 언급한 것처럼 이는 하위 도메인과 기본 도메인이 파일 시스템의 동일한 영역을 가리킨다고 가정합니다. 이는 모든 요청이 단일 CMS에 의해 관리되는 시스템에서 일반적입니다. (그리고 예제 지시문에서 호스트 이름을 변경하려고 시도하지 않았습니다.)
역 %1
참조는 요청된 호스트 이름의 하위 도메인(이 예에서는 "us" 또는 "eg")을 보유합니다.
URL 매개변수 가 없는지 쿼리 문자열을 확인하는 추가 조건 country=
은 다시 쓰기 루프를 방지하는 것입니다.
그런데 URL 경로에 대해서는 아무 것도 언급하지 않으셨나요? 그리고 요청( ?)을 처리하는 파일에 직접 다시 작성해야 합니다 index.php
. 현재 상태에서 위의 "다시 쓰기"는 mod_dir에 의존하여 DirectoryIndex에 대한 추가 하위 요청을 수행합니다.
RewriteRule (US|EG) ?c=$1 [NC , L]
RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]
이 지시문에는 수많은 오류가 있습니다.
- 당신은 이것을 시도해 봤다고 말하지만, 잘못된 것입니다.공백에서깃발인수를 사용하면 파일이 처음 구문 분석될 때 즉시 500 내부 서버 오류가 발생합니다.
- 위에서 언급했듯이,
RewriteRule
무늬(첫 번째 인수)는 URL 경로와만 일치합니다. 여기에는 호스트 이름이 포함되지 않습니다. - #1의 정규식은 너무 일반적이며 "US" 또는 "EG"와 일치합니다.어딘가에.
- 절대 URL과 일치하려면(두 번째 예에서 시도한 것처럼)
THE_REQUEST
서버 변수와 일치해야 합니다(요청 헤더의 첫 번째 줄이 포함되어 있으며 요청 포함).방법).