Redirecionar automaticamente para o subdiretório e também remover www [duplicate]

4

Eu quero fazer duas coisas: redirecionar http://www.example.com (com www ) para http://example.com/fr (sem www , e subdiretório AND)

É claro que também quero que http://example.com redirecione para http://example.com/fr .

Eu vi esta solução:

RewriteCond %{HTTP_HOST} ^(www\.)?example.com$ [NC]
RewriteCond %{REQUEST_URI} !^/fr/.*$
RewriteRule ^(.*)$ /fr/$1 [L,R=301,NC]

Mas isso atrasa meu site como um louco (impossível carregar a página depois). O que devo corrigir no código acima?

Aqui está o meu código completo

Options +FollowSymLinks
RewriteEngine on

RewriteBase /
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^index\.php$ - [L]

RewriteCond %{HTTP_HOST} ^(www\.)?beastof\.com$ [NC]
RewriteCond %{REQUEST_URI} /(.*)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^fr(/|$) /fr/%1 [R=301,L]

RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

(É um multisite do WordPress em subdiretórios.)

    
por Amaury Lefebvre 06.12.2016 / 01:14

1 resposta

2
RewriteCond %{HTTP_HOST} ^(www\.)?example.com$ [NC]
RewriteCond %{REQUEST_URI} !^/fr/.*$
RewriteRule ^(.*)$ /fr/$1 [L,R=301,NC]

Essas diretivas não redirecionam simplesmente " http://www.example.com to http://example.com/fr ". Eles redirecionam http://www.example.com/<anything> para http://www.example.com/fr/<anything> .

But it slows down my website like crazy...

Não há nada particularmente errado com as diretivas que você postou, mas ...

Meu palpite é que você está vinculando a outras páginas / recursos sem o segmento /fr/ do caminho. O que resulta em vários redirecionamentos externos para cada visualização de página - isso pode, potencialmente, tornar o site lento (embora sejam redirecionamentos 301, portanto, devem ser armazenados em cache pelo navegador).

Se esse for o caso, você precisará corrigir seus links internos para incluir esse segmento do caminho /fr/ . Ou, talvez, excluir recursos estáticos desse redirecionamento (se o URL ainda for válido sem o segmento /fr/ caminho)?

Por exemplo, para excluir todos os recursos estáticos, modifique suas diretivas como:

RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteCond %{REQUEST_URI} /(.*)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^fr/ /fr/%1 [R=301,L]

Isso impedirá que os recursos estáticos (arquivos físicos) sejam redirecionados (se ainda é válido, não sei).

Eu também otimizei suas diretivas um pouco (nada que cause uma grande aceleração). Mudei a verificação negada de /fr/ para o padrão RewriteRule , em vez de usar uma diretiva RewriteCond para isso. O RewriteRule padrão é processado primeiro, portanto, é melhor incluir sua primeira verificação aqui, se puder (caso contrário, todas as URLs serão processadas). Em vez disso, a URL é extraída da condição ( %1 em vez de $1 referência anterior na RewriteRule substituição ). Não é necessário usar o sinalizador NC ( NOCASE ) se não for explicitamente necessário.

UPDATE # 1:

example.com/fr (without the trailing slash at the end), [...] redirects to example.com/fr/fr

Para resolver isso, você pode alterar o padrão RewriteRule para excluir uma correspondência exata para /fr ou uma URL que inicia /fr/ , por exemplo:

RewriteRule !^fr(/|$) /fr/%1 [R=301,L]

Isso impedirá que example.com/fr seja redirecionado. (No entanto, esse é um URL válido? Agora você tem dois URLs: example.com/fr e example.com/fr/ presumivelmente acessando o mesmo recurso?)

Here is my complete code

:
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
:

Desde que você adicionou seu "código completo" à sua pergunta, vejo que você já tem um bloco "exceção" (as três diretivas acima) que exclui os recursos estáticos de serem reescritos - é apenas que está no lugar errado. agora que você adicionou as diretivas adicionais acima.

Você deve mover essas três diretivas para diretamente abaixo da diretiva RewriteBase (ou seja, na parte superior). Embora seja necessário excluir a raiz do documento disso (alterando ^ para !^$ - veja abaixo) para permitir que / seja redirecionado para /fr/ - já que o documento root também é um diretório. Você pode então remover a diretiva RewriteCond %{REQUEST_FILENAME} !-f do bloco acima ( na primeira parte desta resposta ).

UPDATE # 2 Então, em resumo ...

(Atualizado para incluir o redirecionamento canônico www para não-www no início. Isso nos permite simplificar a condição posterior que verifica em relação a HTTP_HOST .)

Options +FollowSymLinks
RewriteEngine on

RewriteBase /

# Canonical www to non-www redirect
RewriteCond %{HTTP_HOST} ^www\.(example\.com)$ [NC]
RewriteRule (.*) http://%1/$1 [R=301,L]

# Exception: Exclude files and directories (except the document root)
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule !^$ - [L]

RewriteRule ^index\.php$ - [L]

# Redirect all requests to /fr/ subdirectory
RewriteCond %{HTTP_HOST} =example.com [NC]
RewriteCond %{REQUEST_URI} /(.*)
RewriteRule !^fr(/|$) /fr/%1 [R=301,L]

RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
    
por 06.12.2016 / 14:23