Наш сайт использует следующую схему:
example.com/channels/channel_name?v=videoId
Я хотел бы иметь возможность снимать channel_name
каталог и перепишите его как переменную запроса следующим образом:
example.com/channels?watch=channel_name&v=videoId
Что было бы правильным .htaccess
синтаксис, сохраняющий любые конечные переменные параметра при маскировании преобразования от пользователя?
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
может состоять из персонажей a-z
, A-Z
, 0-9
и _
(который охватывает ваш пример URL).
/channels/front-controller.php
это сценарий, который фактически обрабатывает запрос и возвращает содержимое. Хотя это может быть где угодно, но не обязательно в /channels
каталог (на самом деле, было бы проще, если бы его не было - чтобы избежать возможных конфликтов).
%1
это обратная ссылка на захваченную группу в предыдущем CondPattern. т.е. Значение v=videoId
. Спасает повторение.
Это внутренняя перезапись - URL, который видит пользователь, остается как /channels/channel_name?v=videoId
.
У меня есть обходное решение:
RewriteRule ^channels/(.*)$ /watch/?channel=$1 [R=302,NC,QSA,L]
Хотя это внешнее перенаправление - URL-адрес, который видит пользователь, изменяется на новый URL-адрес. Какой файл обрабатывает запрос в этом случае? Это v=videoId
параметр не требуется?