Nosso site usa o seguinte esquema:
example.com/channels/channel_name?v=videoId
Gostaria de poder capturar o channel_name
diretório e reescrevê-lo como uma variável de consulta da seguinte forma:
example.com/channels?watch=channel_name&v=videoId
Qual seria a .htaccess
sintaxe 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.php
está 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 .htaccess
arquivo raiz:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(v=videoId)$
RewriteRule ^channels/([\w]+)$ channels/front-controller.php?watch=$1&%1 [QSA,L]
Onde the channel_name
pode consistir nos caracteres a-z
, A-Z
e 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 /channels
diretó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=videoId
parâmetro não é obrigatório?