Назад | Перейти на главную страницу

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

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

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 параметр не требуется?