우리 사이트는 다음 스키마를 사용합니다.
example.com/channels/channel_name?v=videoId
channel_name
디렉토리를 캡처하여 다음과 같이 쿼리 변수로 다시 작성할 수 있기를 원합니다 .
example.com/channels?watch=channel_name&v=videoId
.htaccess
사용자의 변환을 마스킹하면서 후행 매개변수 변수를 유지하는 올바른 구문은 무엇입니까 ?
답변1
example.com/channels?watch=channel_name&v=videoId
이 요청을 실제로 처리할 스크립트(즉, 전면 컨트롤러)를 식별하지 않았기 때문에 여기에서 무엇을 하려는지 정확히 알 수 없습니다. URL 매개변수를 읽고 궁극적으로 콘텐츠를 제공하는 스크립트의 이름은 무엇입니까?
파일 시스템의 물리적 디렉토리 라고 명시하셨기 때문에 /channels
(따라서 URL 경로는 최소한 슬래시로 끝나야 합니다. 즉. /channels/?watch=channel_name&v=videoId
) 이는 엄밀히 말하면 재작성을 위한 유효한 끝점이 아닙니다(여전히 필요하기 때문입니다). 실제로 무언가를 수행하는 스크립트에 대한 추가 재작성). 다음과 같은 형식이어야 합니다(PHP를 가정).
example.com/channels/front-controller.php?watch=channel_name&v=videoId
front-controller.php
실제로 요청을 처리하는 스크립트는 어디에 있습니까?전면 컨트롤러).
이 재작성을 달성하려면(에서 /channels/channel_name?v=videoId
) 루트 파일에서 다음과 같은 작업을 수행할 수 있습니다 .htaccess
.
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(v=videoId)$
RewriteRule ^channels/([\w]+)$ channels/front-controller.php?watch=$1&%1 [QSA,L]
여기서 는 , 및 channel_name
문자(예제 URL 포함)로 구성될 수 있습니다 .a-z
A-Z
0-9
_
/channels/front-controller.php
실제로 요청을 처리하고 콘텐츠를 반환하는 스크립트입니다. 이는 어디에나 있을 수 있지만 디렉터리에 있을 필요는 없습니다 /channels
(사실 그렇지 않은 경우 잠재적인 충돌을 피하기 위해 더 쉬울 것입니다).
%1
이전에서 캡처된 그룹에 대한 역참조입니다.조건 패턴. 즉. 가치 v=videoId
. 반복을 저장합니다.
이것은내부 재작성- 사용자에게 표시되는 URL은 으로 유지됩니다 /channels/channel_name?v=videoId
.
해결 방법이 있습니다.
RewriteRule ^channels/(.*)$ /watch/?channel=$1 [R=302,NC,QSA,L]
이는 비록외부 리디렉션- 사용자에게 표시되는 URL이 새 URL로 수정됩니다. 이 경우 요청을 처리하는 파일은 무엇입니까? 매개 v=videoId
변수가 필요하지 않나요?