사례 3: URL에 쿼리 매개변수 추가
example.com
이라는 웹사이트가 기본적으로 모바일 레이아웃을 표시하지만, 데스크톱 레이아웃을 선호한다고 가정해 봅시다. 다행히도 이 웹사이트는 웹사이트가 표시할 레이아웃을 지정하는 layout
쿼리 매개변수를 지원합니다. layout=desktop
을 자동으로 추가하는 규칙을 만들어 봅시다.
아마 다음과 같이 정의할 수 있다고 생각할 것입니다:
- 리디렉션 시작:
https://example.com/.*
(정규 표현식) - 리디렉션 대상:
$0?layout=desktop
$0
은 대상 URL을 참조합니다. example.com/hello
에 접속하려고 하면 example.com/hello?layout=desktop
으로 리디렉션됩니다. 이 기능을 치환이라고 합니다.
와일드카드 모드도 내부적으로 정규 표현식으로 변환되므로 치환을 사용할 수 있습니다.
하지만 이러한 설정에는 몇 가지 문제가 있습니다.
문제 1: 무한 루프
현재 설정은 https://example.com/.*
가 https://example.com/hello?layout=desktop
도 대상으로 하기 때문에 무한 리디렉션 루프를 생성합니다.
이 경우, 정규 표현식을 사용하여 리디렉션 없이 접근할 수 있는 제외된 URL 패턴을 다음과 같이 지정할 수 있습니다:
.*[&?]layout=[^&]*.*
.*
: 모든 문자 일치[&?]
:&
또는?
중 하나 일치[^&]*
:&
를 제외한 모든 문자 일치
문제 2: 기존 매개변수를 제대로 처리할 수 없음
대상 URL에 example.com/hello?theme=dark
와 같은 다른 쿼리 매개변수가 이미 있는 경우, 대상은 example.com/hello?theme=dark?layout=desktop
이 됩니다 (URL에 ?
가 두 개 있습니다). 하지만 매개변수는 &
로만 연결할 수 있습니다. ?
는 특수 문자로서 매개변수 시작 부분에만 허용됩니다. 따라서 유효한 매개변수로 처리되지 않습니다.
이 경우, 설정을 다음과 같이 변경합니다:
- 리디렉션 시작:
(https://example.com/[^?]*)(\(.*))?
- 리디렉션 대상:
$1?layout=desktop&$3
단계별로 살펴보겠습니다.
(https://example.com/[^?]*)
:?
이전 문자까지의 부분을 일치시킵니다.[^?]*
는?
를 제외한 모든 문자를 일치시킵니다.- 이것은
()
로 묶여 있으므로 나중에$1
로 참조할 수 있습니다.
(\(.*))?
:?
로 시작하는 문자열, 즉 쿼리 매개변수를 일치시킵니다.- 이것은 패턴 끝에 있는
?
수량자(0번 또는 1번 일치)에 의해 빈 문자열도 일치시킵니다. - 바깥쪽
()
와 안쪽()
는 나중에$2
와$3
으로 참조할 수 있습니다.
- 이것은 패턴 끝에 있는
RegExr이 세부 사항을 이해하는 데 도움이 될 수 있습니다.
RegExr은 /
를 \
로 이스케이프하지 않으면 오류를 표시합니다. 이스케이프할 수 있지만, Redirect Web은 이스케이프가 필요 없는 Apple의 다른 엔진을 사용하므로 필수는 아닙니다.
이것은 완벽한 해결책이 아닙니다. example.com/hello
를 example.com/hello?layout=desktop&
으로 리디렉션하여 URL 끝에 불필요한 &
를 포함하기 때문입니다. 일반적으로 큰 문제는 아니지만, 제거하고 싶다면 캡처 그룹 처리를 사용할 수 있습니다.
결론적으로, 최종 결과는 다음과 같습니다:
- 리디렉션 시작:
(https://example.com/[^?]*)((\(.*))?)
(정규 표현식) - 리디렉션 대상:
$1?layout=desktop$3
- 제외된 URL 패턴:
.*[&?]layout=[^&]*.*
(정규 표현식) - 캡처 그룹 처리:
- 그룹:
$3
- 처리: 일치 항목 바꾸기
- 대상:
\?(.*)
- 대체:
&$1
- 대상:
- 그룹:
이것은 단지 예시일 뿐입니다. 각 문제를 처리하기 위해 여러 규칙을 만들 수도 있습니다. 훨씬 더 간단할 수 있습니다.