Regras .htaccess para reescrever o diretório como variável de consulta

Regras .htaccess para reescrever o diretório como variável de consulta

Nosso site usa o seguinte esquema:

example.com/channels/channel_name?v=videoId

Gostaria de poder capturar o channel_namediretório e reescrevê-lo como uma variável de consulta da seguinte forma:

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

Qual seria a .htaccesssintaxe correta preservando quaisquer variáveis ​​de parâmetro finais enquanto mascara a transformação do usuário?

Responder1

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

Ainda não está claro exatamente o que você está tentando fazer aqui, pois você não identificou o script (ou seja, o controlador frontal) que realmente lidaria com essa solicitação. Qual é o nome do script que lê os parâmetros da URL e, por fim, veicula o conteúdo?

Você afirmou que /channelsé um diretório físico no sistema de arquivos (portanto, o caminho da URL precisaria terminar pelo menos em uma barra, ou seja. /channels/?watch=channel_name&v=videoId), portanto, este não é estritamente um ponto final válido para uma reescrita (pois ainda requer reescrita adicional do script que realmente faria alguma coisa). Precisaria estar no formato (assumindo PHP):

example.com/channels/front-controller.php?watch=channel_name&v=videoId

Onde front-controller.phpestá o script que realmente trata a solicitação (ou seja, ocontrolador frontal).

Para conseguir essa reescrita (de /channels/channel_name?v=videoId), você poderia fazer algo como o seguinte no .htaccessarquivo raiz:

RewriteEngine On

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

Onde the channel_namepode consistir nos caracteres a-z, A-Ze 0-9( _que cobre seu URL de exemplo).

/channels/front-controller.phpé o script que realmente trata a solicitação e retorna o conteúdo. Embora possa estar em qualquer lugar, não precisa estar no /channelsdiretório (na verdade, seria mais fácil se não estivesse - para evitar possíveis conflitos).

%1é uma referência anterior ao grupo capturado no anteriorCondPadrão. ou seja. O valor que v=videoId. Economiza repetição.

Isto é umreescrita interna- a URL que o usuário vê permanece como /channels/channel_name?v=videoId.

Eu tenho uma solução alternativa:

RewriteRule ^channels/(.*)$ /watch/?channel=$1 [R=302,NC,QSA,L]

Embora este seja umredirecionamento externo- o URL que o usuário vê é modificado para o novo URL. Qual arquivo trata da solicitação neste caso? O v=videoIdparâmetro não é obrigatório?

informação relacionada