
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 ( RewriteCond
diretiva) que verifique a HTTP_HOST
variável do servidor (ou seja, o valor do Host
cabeç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 %1
referê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.
RewriteRule (US|EG) ?c=$1 [NC , L]
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, o
RewriteRule
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_REQUEST
variável do servidor (que contém a primeira linha dos cabeçalhos da solicitação, incluindo a solicitaçãométodo).