본문으로 건너뛰기

사례 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/helloexample.com/hello?layout=desktop&으로 리디렉션하여 URL 끝에 불필요한 &를 포함하기 때문입니다. 일반적으로 큰 문제는 아니지만, 제거하고 싶다면 캡처 그룹 처리를 사용할 수 있습니다.

결론적으로, 최종 결과는 다음과 같습니다:

  • 리디렉션 시작: (https://example.com/[^?]*)((\(.*))?) (정규 표현식)
  • 리디렉션 대상: $1?layout=desktop$3
  • 제외된 URL 패턴: .*[&?]layout=[^&]*.* (정규 표현식)
  • 캡처 그룹 처리:
    • 그룹: $3
    • 처리: 일치 항목 바꾸기
      • 대상: \?(.*)
      • 대체: &$1

⬇️ 규칙 다운로드

이것은 단지 예시일 뿐입니다. 각 문제를 처리하기 위해 여러 규칙을 만들 수도 있습니다. 훨씬 더 간단할 수 있습니다.