. Правила htaccess для перезаписи каталога как переменной запроса

Наш сайт использует следующую схему:

example.com/channels/channel_name?v=videoId

Я хотел бы иметь возможность захватить каталог имя_канала и переписать его как переменную запроса, например:

example.com/channels?watch=channel_name&v=videoId

Что бы быть правильным синтаксисом .htaccess , сохраняющим любые конечные переменные параметров при маскировании преобразования от пользователя?

0
задан 27 January 2020 в 20:17
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 может состоять из символы 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 не требуется?

1
ответ дан 26 February 2020 в 00:36

Теги

Похожие вопросы