문제

나는 사용하고있다 Helicon의 ISAPI 재작성 3, 기본적으로 IIS에서 .htaccess를 활성화합니다.www가 아닌 ​​URL을 www 버전으로 리디렉션해야 합니다. 즉,example.com은 www.example.com으로 리디렉션되어야 합니다.예제에서 다음 규칙을 사용했지만 하위 도메인에 영향을 미칩니다.

RewriteCond %{HTTPS} (on)?
RewriteCond %{HTTP:Host} ^(?!www\.)(.+)$ [NC]
RewriteCond %{REQUEST_URI} (.+)
RewriteRule .? http(?%1s)://www.%2%3 [R=301,L]

이는 대부분의 경우 작동하지만 sub.example.com을 www.sub.example.com으로 리디렉션할 수도 있습니다.하위 도메인이 리디렉션되지 않도록 위 규칙을 어떻게 다시 작성할 수 있습니까?

도움이 되었습니까?

해결책

다음 RewriteCond를 추가합니다.

RewriteCond %{HTTP:Host} ^[^.]+\.[a-z]{2,5}$ [NC]

이렇게 하면 보시다시피 nondottedsomething.uptofiveletters에만 규칙이 적용되며 subdomain.domain.com은 조건과 일치하지 않으므로 다시 작성되지 않습니다.

더 엄격한 tld 일치 정규식을 위해 [a-z]{2,5}를 변경할 수 있을 뿐만 아니라 도메인 이름에 허용되는 문자에 대한 모든 제약 조건을 배치할 수도 있습니다([^.]+는 꼭 필요한 것보다 더 허용적이므로).

전체적으로 이 경우에는 그럴 필요가 없다고 생각합니다.

편집하다:Sadie는 정규식에서 결함을 발견하고 첫 번째 부분을 [^.]에서 [^.]+로 변경했습니다.

다른 팁

나는 다음을 사용하여 더 많은 제어권을 얻었습니다. urlrewriter.net, 다음과 같습니다:

<unless header="Host" match="^www\.">
   <if url="^(https?://)[^/]*(.*)$">
     <redirect to="$1www.domain.tld$2"/>
   </if>
   <redirect url="^(.*)$" to="http://www.domain.tld$1"/>
</unless>

Zigdon은 그의 정규식이 옳지 않다는 점을 제외하면 올바른 생각을 가지고 있습니다.사용

^example\.com$

그의 제안 대신 :

^example\.com(.*)

그렇지 않으면 example.com만 일치하는 것이 아니라 example.comcast.net, example.com.au 등과 같은 항목도 일치하게 됩니다.

@빈코

일반적인 접근 방식의 경우 정규식에서 TLD 길이를 제한하기로 선택한 이유가 무엇인지 잘 모르겠습니다.미래 지향적이지도 않고 어떤 이점을 제공하는지 잘 모르겠습니다.일치하지 않는 6자 TLD(.museum)가 하나 이상 있기 때문에 실제로 "현재 증명"되지도 않습니다.

내가 보기에는 이렇게 하는 것이 불필요해 보인다.그냥 할 수는 없었나요 ^[^.]+\.[^.]\+$?(메모:물음표는 정규식이 아니라 문장의 일부입니다!)

그 외에도 이 접근 방식에는 다음과 같은 더 큰 문제가 있습니다.TLD 바로 아래에 있지 않은 도메인의 경우 실패합니다.이는 호주, 영국, 일본 및 기타 여러 국가의 도메인이며 계층 구조가 있습니다..co.jp, .co.uk, .com.au 등.

그것이 OP에 대한 우려 사항인지 아닌지는 모르겠지만 "모두 수정" 답변을 찾고 있다면 알아야 할 사항입니다.

OP는 일반 솔루션을 원하는지, 알려진 도메인의 단일(또는 소규모 그룹)에 대한 솔루션을 원하는지 아직 명확하게 밝히지 않았습니다.후자라면 Zigdon의 접근 방식 사용에 대한 다른 참고 사항을 참조하세요.전자인 경우 이 게시물의 정보를 고려하여 Vinko의 접근 방식을 진행하세요.

편집하다:비즈니스 측면에서 선택 사항일 수도 있고 아닐 수도 있는 지금까지 제가 빠뜨린 한 가지는 다른 방향으로 가는 것입니다.모든 사이트 리디렉션 http://www.domain.com 에게 http://도메인.com.사람들은 http://no-www.org 이것이 "올바른" 방법이라는 점에 대해 매우 좋은 사례(IMHO)를 만들지만 여전히 확실히 선호의 문제일 뿐입니다.하지만 한 가지 확실한 점은 이러한 종류의 리디렉션에 대한 일반적인 규칙을 작성하는 것이 이 규칙보다 훨씬 쉽다는 것입니다.

@org 0100h 예, 문제 설명에서 빠진 변수가 많으며 모든 요점은 유효한 것이며 실제 구현 시 해결되어야 합니다.제안한 정규식에는 장단점이 있습니다.한편으로는 더 쉽고 미래에도 대비할 수 있지만, 다른 한편으로는 Host 헤더로 전송된 경우 example.foobar를 일치시키고 싶습니까?잘못된 도메인으로 리디렉션하게 되는 극단적인 경우가 있을 수 있습니다.세 번째 대안은 다음과 같이 실제 도메인 목록을 사용하도록 정규식을 수정하는 것입니다.

RewriteCond %{HTTP:Host} (example.com|example.net|example.org) [NC]

(크리스에게 주의하세요. ~ 할 것이다 %1 변경)

@chrisofspades 그것을 대체하려는 것이 아닙니다. 귀하의 조건 번호 2는 www가 없는 반면 내 것은 www가 없음을 보장합니다.일치하는 항목을 저장하지 않기 때문에 %1, %2, %3의 값은 변경되지 않습니다(아, 괄호를 사용하지 않음).

example.com에서만 작동하도록 RewriteCond를 조정할 수 없나요?

RewriteCond %{HTTP:Host} ^example\.com(.*) [NC]

vhost(httpd의) 파일에 이와 같은 것이 없는 이유는 무엇입니까?

ServerName: www.example.com
ServerAlias: example.com

물론 리디렉션되지는 않으며 정상적으로 진행됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top