RewriteRule ^he\/?(.*)$ "https\:\/\/example\.com\/$1" [R=301,L]
이 RewriteRule의 의미는 무엇입니까? 단순화할 수 있나요?
나는 그 책을 반복해서 읽었고, 매번 다시 길을 잃었습니다.
일치 he/
하지만 나머지는 모두 이해할 수 없습니다.
답변1
설명하다
he
및로 시작하는 URI 경로와 일치합니다.임의로 선택할 수 있는 /
, 나머지 URI 경로를 캡처합니다(캡처 대괄호 세트가 하나만 있으므로 으로 캡처됩니다 $1)
. 쿼리 문자열이 있는 경우 이를 캡처하지 않습니다.
규칙을 다음과 같이 다시 작성합니다 https://example.com/$1
.
이 R=301
플래그는 아파치에게 영구 리디렉션 코드(301)를 사용하도록 지시합니다. 이 L
플래그는 Apache에게 이 URI 경로에 대한 추가 재작성 규칙 처리를 중지하도록 지시합니다. 즉, 그 이상의 규칙이 있으면 패턴과 일치하더라도 적용되지 않습니다.
즉 , 다음 으로 he
시작하는 모든 URI를 리디렉션합니다 .he/ or
https://example.com/
he/foo.html
https://example.com/foo.html
단순화하다
ModRewrite 규칙의 패턴이나 대체에는 슬래시를 이스케이프할 필요가 없으므로 다음과 같이 단순화할 수 있습니다.
RewriteRule ^he/?(.*)$ https://example.com/$1 [R=301,L]
그건 그렇고, 이것이 he/
문서 루트의 하위 디렉터리에 있는 모든 것을 리디렉션하는 것이라면 그렇게 할 것입니다. 그럴 것이다반품로 시작하는 문서 루트의 .html 또는 기타 파일을 캡처합니다( he
예: hello.html
로 리디렉션됨) https://example.com/llo.html
.
이 작업을 수행하지 않으려면 ?
을 제거하세요 /
. 정규식에서 는 ?
이전 요소를 0 또는 한 번 일치시키는 것을 의미합니다(즉, 일치하는 것은 선택 사항임). 패턴 일치를 필수로 설정 하려면 /
선택 사항으로 만들지 말고 대신 다음을 사용하세요.
RewriteRule ^he/(.*)$ https://example.com/$1 [R=301,L]
그러나 he
uri가 로 끝나지 않으면 /
다음이 필요합니다.
RewriteRule ^he($|/.*$) https://example.com$1 [R=301,L]
IMO, 위의 규칙은 아마도 당신이 정말로 원하는 것일 것입니다... 그러나 /
당신이 원하는 것이 선택 사항 이라면 /?
그것은 패턴에 필요하지 않습니다. 그것은 여전히 /
after가 있거나 없이 URI 와 일치할 것입니다 he
:
RewriteRule ^he(.*)$ https://example.com/$1 [R=301,L]
URI 문제?
마지막으로, 귀하의 아파치 서버가 어떻게 설정되어 있는지는 모르지만 아파치 재작성 규칙에 의해 표시되는 URI는 일반적으로 로 시작하므로 패턴 /
앞에 서버가 있어야 한다고 생각합니다 . 예를 들면 다음과 같습니다.he
/
RewriteRule ^/he($|/.*$) https://example.com$1 [R=301,L]