htaccess는 물음표 매개변수가 있는 모든 URL을 물음표 없이 리디렉션합니다.

htaccess는 물음표 매개변수가 있는 모든 URL을 물음표 없이 리디렉션합니다.

내 질문에 대해 많이 확인했습니다. 가까운 것이 있지만 내 문제를 해결할 수 있는 것은 없습니다.

다음으로 끝나는 모든 URL을 영구적으로 리디렉션해야 합니다.

?mode=list

그리고

?mode=grid

~ 없이(물음표와 그 뒤에 무엇이 있는지 제거)

예:

example.com/random-url-here?mode=grid redirect to example.com/random-url-here

그리고

example.com/whatever-url-here?mode=list redirect to example.com/random-url-here

나는 이것을 시도했다:

RewriteEngine on 
RewriteRule (.*)$^mode=list $1
RewriteRule (.*)$^mode=grid $1

RewriteEngine on 
RewriteRule (.*)$^mode=list $1 [L,R=301]
RewriteRule (.*)$^mode=grid $1 [L,R=301]

하지만 작동하지 않습니다. 분명히 나는 ​​이것이 어떻게 작동하는지 이해하지 못합니다. 도와주세요.

감사합니다

답변1

example.com/random-url-here?mode=grid

URL에서 첫 번째 부분 ?(예: mode=grid이 예에서는) 뒤의 부분을쿼리 문자열.

RewriteRule (.*)$^mode=list $1 [L,R=301]

지시문 은 RewriteRule최대 3개의 인수를 사용합니다.

RewriteRule pattern substitution [flags]

그만큼무늬지시문 에 대한 (첫 번째 인수)는 RewriteRule요청된 항목과 일치하는 정규식(regex)입니다.URL 경로만, 이는 특히 쿼리 문자열을 제외합니다. 따라서 지시문을 사용하여 쿼리 문자열을 일치시킬 수 없습니다 RewriteRule.

쿼리 문자열을 일치시키려면 추가 (조건) 지시문을 사용 RewriteCond하고 서버 변수를 확인 해야 합니다 QUERY_STRING. RewriteCond지시문이 적용됩니다정황RewriteRule다음 지시어 에 .

그러나 정규 표현식 (.*)$^mode=list(쿼리 문자열 일치를 시도하는 것 제외)은절대이 맥락에서 일치합니다. $줄 끝을 주장하고 ^줄 시작을 주장하므로 항상 실패합니다.

위의 예에서 $1역참조(대체 문자열)이 URL 경로와 일치하려고 시도하고 있습니다. 그러나 이 URL 경로(예배 규칙서맥락, 즉. .htaccess)는 슬래시로 시작하지 않습니다(예:상대적인RewriteBase), 따라서 파일 의 다른 곳에 지시문을 정의 하지 않는 한 잘못된 형식의 리디렉션이 발생합니다 .htaccess. ㅏ상대적인대체 문자열은 파일이 포함된 디렉터리에 상대적인 파일 시스템 경로로 표시됩니다 .htaccess.

R이 컨텍스트에서 ( 첫 번째 예에서와 같이) 플래그 를 생략하면 redirect내부적으로 요청을 다시 작성하려고 시도하므로(외부 리디렉션이 아님) 표시되는 URL은 변경되지 않습니다.

대신 루트 파일 상단 근처에서 다음을 시도해 보세요 .htaccess.

RewriteEngine On

RewriteCond %{QUERY_STRING} ^mode=(list|grid)$
RewriteRule (.*) /$1 [QSD,R=302,L]

위의 내용은... 또는 (정확히) (.*)쿼리 문자열이 있는 모든 URL에 대해 동일한 URL 경로로 리디렉션되고 쿼리 문자열을 삭제합니다( - 쿼리 문자열 삭제). 이는 Apache 2.4의 새로운 기능입니다(귀하가 사용하고 있다고 가정합니다). 플래그 를 생략하면 리디렉션 루프가 발생합니다(쿼리 문자열이 리디렉션된 URL에 다시 추가되므로).mode=listmode=gridQSDQSDQSD

위의 내용은 쿼리 문자열과 일치합니다.정확히(귀하의 예에서와 같이). 쿼리 문자열에 다른 URL 매개변수가 있거나 대소문자가 다른 경우 일치에 실패합니다.

이는 302(임시) 리디렉션이라는 점에 유의하세요. 의도한 경우에만 301(영구)로 변경하세요. 제대로 작동하는지 확인한 후에만 가능합니다. 301은 브라우저에 의해 지속적으로 캐시되므로 테스트에 문제가 발생할 수 있습니다.

참조:

관련 정보