.htaccess redireciona todos os domínios, com caminhos, para um

1

Eu tenho três domínios todos apontando para o mesmo espaço de hospedagem, espelhados usando A records:

  • example.org
  • example.org.uk
  • example.co.uk

Eu tenho um site na raiz ( / ) e uma instalação do MediaWiki em example.org/members/wiki . Gostaria que todas as solicitações redirecionassem para HTTPS e para o domínio .org .

Eu gerenciei isso com o site usando .htaccess na raiz:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !example.org$ [NC]
RewriteRule (.*) https://www.example.org/$1 [R=301,L]

mas não consigo fazê-lo funcionar com o wiki - as solicitações para os domínios .org.uk ou .co.uk não são redirecionadas.

Eu tenho esse .htaccess em /members :

Options -Indexes
RewriteEngine On
RewriteRule ^example.org.uk(/.*)?$     https://www.example.org/$1
RewriteRule ^example.co.uk(/.*)?$ https://www.example.org/$1 

# MediaWiki pretty URL rewrites
RewriteRule ^/?members/wiki(/.*)?$ %{DOCUMENT_ROOT}/members/wiki/index.php [L]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/members/wiki/index.php [L]

Eu quero, por exemplo, example.co.uk/members/wiki/My_Page para redirecionar diretamente para https://www.example.org/members/wiki/My_Page .

Alguém pode me dizer o que está errado?

    
por melat0nin 21.01.2018 / 14:39

1 resposta

1

Seu problema é que as diretivas mod_rewrite não são herdadas por padrão. As diretivas mod_rewrite no seu arquivo /members/.htaccess estão completamente sobrescrevendo as diretivas mod_rewrite no arquivo pai .htaccess . As diretivas mod_rewrite no arquivo pai .htaccess não estão sendo executadas quando seu wiki é acessado.

Você pode habilitar a herança mod_rewrite do arquivo /members/.htaccess (usando RewriteOptions Inherit ), no entanto, as diretivas atuais no arquivo pai .htaccess ainda não funcionarão se forem herdadas. (As diretivas são herdadas como se fossem literalmente copiadas para os subdiretórios .htaccess file.)

Para usar a herança mod_rewrite, você precisaria alterar as seguintes diretivas no arquivo pai .htaccess :

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !example.org$ [NC]
RewriteRule (.*) https://www.example.org/$1 [R=301,L]

para ler:

RewriteEngine On
RewriteCond %{HTTP_HOST} !example\.org$
RewriteRule ^ https://www.example.org%{REQUEST_URI} [R=301,L]

A diretiva RewriteBase é supérflua aqui. (A menos que você tenha outras diretivas?) A variável de servidor REQUEST_URI contém o caminho de URL completo, independentemente de onde é usado, diferente do caminho de URL capturado do padrão RewriteRule que notavelmente tem o prefixo do diretório removido em um diretório / .htaccess context. O NC flag também deve ser removido neste CondPattern negado , pois você também deseja redirecionar solicitações malformadas.

Além de: No entanto, isso ainda não canoniza o subdomínio www e nem redirecionará solicitações não HTTPS para example.org - isso é um requisito? Para isso, você precisaria de algo como o seguinte:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^example\.org$ [OR]
RewriteCond %{HTTPS} !on
RewriteRule ^ https://www.example.org%{REQUEST_URI} [R=301,L]

Observe o início da âncora de string ( ^ ) no CondPattern ( !^example\.org$ ). E a verificação adicional contra a variável HTTPS server (que é OR'd).

Em seguida, em /members/.htaccess , você substitui a primeira parte (o que nunca funcionaria de qualquer maneira, pois o padrão RewriteRule corresponde apenas ao caminho da URL, não ao nome do host):

Options -Indexes
RewriteEngine On
RewriteRule ^example.org.uk(/.*)?$     https://www.example.org/$1
RewriteRule ^example.co.uk(/.*)?$ https://www.example.org/$1 

Com o seguinte:

Options -Indexes
RewriteEngine On
RewriteOptions Inherit

Como alternativa, você esquece a herança e simplesmente copia as diretivas mod_rewrite pai para o arquivo /members/.htaccess :

Options -Indexes
RewriteEngine On
RewriteCond %{HTTP_HOST} !example\.org$
RewriteRule ^ https://www.example.org%{REQUEST_URI} [R=301,L]
# MediaWiki pretty URL rewrites
RewriteRule ^/?members/wiki(/.*)?$ %{DOCUMENT_ROOT}/members/wiki/index.php [L]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/members/wiki/index.php [L]

De qualquer forma: No entanto, essas diretivas não funcionariam em um arquivo /members/.htaccess ? Essas diretivas são destinadas ao contexto de configuração do servidor (ou VirtualHost).

Em arquivos .htaccess por diretório, o padrão RewriteRule corresponde ao URL-caminho menos o prefixo do diretório . Portanto, um padrão que inicia ^/?members/ nunca corresponderá quando o próprio arquivo .htaccess estiver no subdiretório /members . (No entanto, isso funcionaria em um contexto de servidor / VirtualHost, pois o padrão corresponde ao caminho completo da URL.)

Além disso, nos arquivos por diretório .htaccess você não pode reescrever para um caminho absoluto do sistema de arquivos , ele deve ser um caminho URL relativo à raiz do documento. (No entanto, você poderia fazer isso em um contexto de servidor / VirtualHost.)

Além disso, %{DOCUMENT_ROOT}%{REQUEST_URI} é mais típico de uma diretiva usada na configuração do servidor. É mais simples usar apenas %{REQUEST_FILENAME} em .htaccess .

Para isso funcionar em /members/.htaccess , você precisaria alterar essas diretivas para ler algo mais parecido com o seguinte:

# MediaWiki pretty URL rewrites
RewriteRule ^wiki(/.*)?$ wiki/index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ wiki/index.php [L]
    
por 22.01.2018 / 17:50