Наш сайт использует следующую схему:
example.com/channels/channel_name?v=videoId
Я хотел бы иметь возможность захватить каталог имя_канала
и переписать его как переменную запроса, например:
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
может состоять из символы az
, AZ
, 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
не требуется?