Nuestro sitio utiliza el siguiente esquema:
example.com/channels/channel_name?v=videoId
Me gustaría poder capturar el channel_name
directorio y reescribirlo como una variable de consulta así:
example.com/channels?watch=channel_name&v=videoId
¿Cuál sería la .htaccess
sintaxis correcta para preservar las variables de parámetros finales y al mismo tiempo enmascarar la transformación para el usuario?
Respuesta1
example.com/channels?watch=channel_name&v=videoId
Todavía no está claro exactamente qué está intentando hacer aquí, ya que no ha identificado el script (es decir, el controlador frontal) que realmente manejaría esta solicitud. ¿Cuál es el nombre del script que lee los parámetros de la URL y, en última instancia, muestra el contenido?
Ha indicado que /channels
es un directorio físico en el sistema de archivos (por lo que la ruta URL debería terminar al menos con una barra, es decir /channels/?watch=channel_name&v=videoId
), por lo que este no es estrictamente un punto final válido para una reescritura (ya que todavía requiere reescritura adicional del guión que realmente haría algo). Debería tener la forma (asumiendo PHP):
example.com/channels/front-controller.php?watch=channel_name&v=videoId
¿Dónde front-controller.php
está el script que realmente maneja la solicitud (es decir, elcontrolador frontal).
Para lograr esta reescritura (desde /channels/channel_name?v=videoId
), puede hacer algo como lo siguiente en el .htaccess
archivo raíz:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(v=videoId)$
RewriteRule ^channels/([\w]+)$ channels/front-controller.php?watch=$1&%1 [QSA,L]
Donde channel_name
puede constar de los caracteres a-z
, A-Z
y 0-9
( _
que cubre la URL de ejemplo).
/channels/front-controller.php
es el script que realmente maneja la solicitud y devuelve el contenido. Aunque esto puede estar en cualquier lugar, no es necesario que esté en el /channels
directorio (de hecho, sería más fácil si no lo estuviera, para evitar posibles conflictos).
%1
es una referencia al grupo capturado en el anteriorPatrónCond. es decir. el valor v=videoId
. Guarda la repetición.
Esto es unreescritura interna- la URL que ve el usuario permanece como /channels/channel_name?v=videoId
.
Tengo una solución alternativa:
RewriteRule ^channels/(.*)$ /watch/?channel=$1 [R=302,NC,QSA,L]
Aunque esto es unredireccionamiento externo- la URL que ve el usuario se modifica a la nueva URL. ¿Qué expediente maneja la solicitud en este caso? ¿No es necesario el v=videoId
parámetro?