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]