Reglas .htaccess para reescribir el directorio como variable de consulta

Reglas .htaccess para reescribir el directorio como variable de consulta

Nuestro sitio utiliza el siguiente esquema:

example.com/channels/channel_name?v=videoId

Me gustaría poder capturar el channel_namedirectorio y reescribirlo como una variable de consulta así:

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

¿Cuál sería la .htaccesssintaxis 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 /channelses 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.phpestá 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 .htaccessarchivo raíz:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^(v=videoId)$
RewriteRule ^channels/([\w]+)$ channels/front-controller.php?watch=$1&%1 [QSA,L]

Donde channel_namepuede constar de los caracteres a-z, A-Zy 0-9( _que cubre la URL de ejemplo).

/channels/front-controller.phpes 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 /channelsdirectorio (de hecho, sería más fácil si no lo estuviera, para evitar posibles conflictos).

%1es 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=videoIdparámetro?

información relacionada