Наш сайт использует следующую схему:
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
Пока неясно, что именно вы пытаетесь сделать, поскольку вы не определили скрипт (т. е. front-controller), который фактически обработает этот запрос. Как называется скрипт, который считывает параметры 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
необязателен?