htaccess reescrever país sem subdomínios

htaccess reescrever país sem subdomínios

eu preciso reescrever o URL de

us.example.com

para

example.com?country=us

sem subdomínios

Eu tentei estas 2 regras:

1.

RewriteRule (US|EG) ?c=$1 [NC , L]

2.

RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]

mas eles não funcionaram.

então .. existe alguma maneira de fazer isso?

Responder1

Você não pode "reescrever" uma URL em diferentes nomes de host (seria necessário implementar um proxy reverso) e presumo que um "redirecionamento" seja indesejável.

No entanto, se todos os subdomínios e o domínio principal apontarem para a mesma área do sistema de arquivos, você não precisará alterar o nome do host/domínio. Uma reescrita comum (no mesmo host) é tudo o que é necessário.

Para verificar o subdomínio no host solicitado, você precisa de uma condição ( RewriteConddiretiva) que verifique a HTTP_HOSTvariável do servidor (ou seja, o valor do Hostcabeçalho da solicitação HTTP). ORewriteRule padrãocorresponde apenas à parte do caminho do URL do URL.

Por exemplo:

RewriteEngine On

RewriteCond %{QUERY_STRING} !^country=
RewriteCond %{HTTP_HOST} ^(us|eg)\.example\.com [NC]
RewriteRule ^ /?country=%1 [L]

Conforme observado acima, isso pressupõe que os subdomínios e o domínio principal apontem para a mesma área do sistema de arquivos. Isso é comum em um sistema onde todas as solicitações são gerenciadas por um único CMS. (E você não está tentando alterar o nome do host nas suas diretivas de exemplo.)

A %1referência anterior contém o subdomínio ("us" ou "eg" neste exemplo) do nome do host solicitado.

A condição adicional que verifica a string de consulta quanto à ausência do country=parâmetro URL é evitar um loop de reescrita.

No entanto, você não declarou nada sobre o caminho da URL? E você deve reescrever diretamente no arquivo que está tratando a solicitação ( index.php?). Em seu estado atual, a "reescrita" acima depende de mod_dir fazer uma subsolicitação adicional para o DirectoryIndex.


  1. RewriteRule (US|EG) ?c=$1 [NC , L]
  2. RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]

Existem vários erros com estas diretivas:

  • Você diz que tentou isso, no entanto, o erroespaçosnobandeirasargumento resultará em um erro 500 interno do servidor imediato quando o arquivo for analisado pela primeira vez.
  • Como mencionado acima, oRewriteRule padrão(primeiro argumento) corresponde apenas ao caminho da URL. Isso não inclui o nome do host.
  • A regex no nº 1 é muito geral e corresponde a "US" ou "EG"em qualquer lugar.
  • Para fazer a correspondência com um URL absoluto (como você parece estar tentando fazer no segundo exemplo), você precisaria fazer a correspondência com a THE_REQUESTvariável do servidor (que contém a primeira linha dos cabeçalhos da solicitação, incluindo a solicitaçãométodo).

informação relacionada