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

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

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

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необязателен?

Связанный контент