Pergunta

Problema

Preciso redirecionar alguns URLs curtos de conveniência para URLs reais mais longos.O site em questão usa um conjunto de subdomínios para identificar um conjunto de desenvolvimento ou versões ativas.

Gostaria que o URL para o qual certas solicitações são redirecionadas incluísse o HTTP_HOST para que eu não precisasse criar um arquivo .htaccess personalizado para cada host.

Exemplo específico de host (recortado do arquivo .htaccess)

Redirect /terms http://support.dev01.example.com/articles/terms/

Este exemplo funciona bem para a versão de desenvolvimento em execução em dev01.example.com.Se eu usar a mesma linha no arquivo .htaccess principal para a versão de desenvolvimento em execução em dev02.example.com, acabarei sendo redirecionado para o lugar errado.

Regra ideal (não tenho certeza da sintaxe correta)

Redirect /terms http://support.{HTTP_HOST}/articles/terms/

Esta regra não funciona e serve apenas como exemplo do que eu gostaria de alcançar.Eu poderia então usar exatamente a mesma regra em muitos hosts diferentes e obter o resultado correto.

Respostas?

  • Isso pode ser feito com mod_alias ou requer o mod_rewrite mais complexo?
  • Como isso pode ser conseguido usando mod_alias ou mod_rewrite?Eu preferiria uma solução mod_alias, se possível.

Esclarecimentos

Não vou ficar no mesmo servidor.Eu gostaria:

Gostaria de poder usar a mesma regra no arquivo .htaccess em example.com e dev.example.com.Nessa situação, eu precisaria me referir ao HTTP_HOST como uma variável, em vez de especificá-lo literalmente na URL para a qual as solicitações são redirecionadas.

Vou investigar o parâmetro HTTP_HOST conforme sugerido, mas esperava um exemplo prático.

Foi útil?

Solução

É estranho que ninguém tenha feito o verdadeiro trabalhando resposta (risos):

RewriteCond %{HTTP_HOST} support\.(([^\.]+))\.example\.com
RewriteRule ^/terms http://support.%1/article/terms [NC,QSA,R]

Para ajudá-lo a fazer o trabalho com mais rapidez, minha ferramenta favorita para verificar regexp:

http://www.quanetic.com/Regex (não se esqueça de escolher ereg(POSIX) em vez de preg(PCRE)!)

Você usa esta ferramenta quando deseja verificar os URLs e ver se eles são válidos ou não.

Outras dicas

Acho que você deseja capturar o valor HTTP_HOST e usá-lo na regra de reescrita:

RewriteCond %{HTTP_HOST} (.*)
RewriteRule ^/terms http://support.%1/article/terms [NC,R=302]

Se entendi bem sua pergunta, você deseja um redirecionamento 301 (diga ao navegador para ir para outro URL).Se minha solução não for a correta para você, tente esta ferramenta: http://www.htaccessredirect.net/index.php e descubra o que funciona para você.

//301 Redirect Entire Directory
RedirectMatch 301 /terms(.*) /articles/terms/$1

//Change default directory page
DirectoryIndex 

De acordo com esta folha de dicas ( http://www.addedbytes.com/download/mod_rewrite-cheat-sheet-v2/png/ ) isso deve funcionar

RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain2.com/$1

Observe que não tenho como testar isso, portanto, isso deve ser considerado um indicador na direção certa, em vez de uma resposta explícita.

Se você estiver no mesmo servidor, colocar isso no seu .htaccess funcionará independentemente do servidor:

RedirectMatch 301 ^/terms$ /articles/terms/

Produz:

http://example.com/terms -> http://example.com/articles/terms

ou:

http://test.example.com/terms -> http://test.example.com/articles/terms

Obviamente, você precisará ajustar a correspondência de REGEX e similares para ter certeza de que ela atende ao que você vai aplicar.O mesmo vale para o 301, você pode querer um 302 se não quiser que os navegadores armazenem o redirecionamento em cache.

Se você quiser:

http://example.com/terms -> http://server02.example.com/articles/terms

Então você precisará usar o parâmetro HTTP_HOST.

Você não precisa incluir essas informações.Basta fornecer um URI relativo à raiz.

Redirect temp /terms /articles/terms/

Isto é explicado em a documentação mod_alias:

A nova URL deve ser uma URL absoluta começando com um esquema e um nome de host, mas um caminho de URL começando com uma barra também pode ser usado, caso em que o esquema e o nome de host do servidor atual serão adicionados.

Parece que o que você realmente precisa é apenas de um apelido?

Alias /terms /www/public/articles/terms/
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top