Apache: redireciona todas as solicitações .html AND .php para a pasta + WordPress

1

Após um relançamento, tenho vários backlinks mortos apontando para URLs com .php ou .html file-extensions. Seria bom redirecioná-los em massa usando .htaccess e o módulo mod_rewrite.

O redirecionamento de solicitações de .html está funcionando bem. No entanto, não consigo fazer o redirecionamento de .php URLs funcionar. Por favor, note que eu uso o WordPress, então tem que haver uma isenção da pasta /wp-admin/ .

Isso é o que eu criei até agora, mas não funciona para .php :

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# Redirect http requests to https
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^(.*)$ https://www.example.com/$1 [L]

# Redirect html
RewriteCond %{REQUEST_URI} \.html
RewriteRule ^(.*)\.html$ /$1 [L] 

# Redirect php NOT WORKING
RewriteCond %{REQUEST_URI} !^/wp-admin/
RewriteCond %{REQUEST_URI} \.php
RewriteRule ^(.*)\.php$ /$1 [L] 

# Lines below come from WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Você consegue identificar onde estou errado? Ou eu estou completamente perdido?

    
por schuggerleo 19.07.2018 / 16:39

1 resposta

1
# Redirect html
RewriteCond %{REQUEST_URI} \.html
RewriteRule ^(.*)\.html$ /$1 [L]

Este não é um "redirecionamento", como em um "redirecionamento 3xx externo", que você parece estar sugerindo. Se você está vendo um "redirecionamento", então alguma outra coisa está fazendo isso, ou você está vendo uma resposta em cache. A diretiva acima é uma reescrita interna - a URL na barra de endereços do navegador não muda (isso seria ruim para SEO).

A diretiva RewriteCond também é supérflua neste caso ... apenas significa que você está verificando a .html na URL solicitada duas vezes .

Se você quiser remover a extensão .html por meio de um redirecionamento, precisará de algo como:

RewriteRule ^(.*)\.html$ /$1 [R,L]

No entanto, para remover a extensão .php do URL, também é preciso evitar o redirecionamento de index.php (para o qual o controlador de frente do WordPress reescreve para) ou verificar apenas se você está verificando a solicitação inicial, não a solicitação reescrita. Por exemplo:

# Redirect php (avoiding "/wp-admin/" and "/index.php")
RewriteCond %{REQUEST_URI} !^/index.php$
RewriteCond %{REQUEST_URI} !^/wp-admin/
RewriteRule ^(.*)\.php$ /$1 [R,L]

Para garantir que você está testando apenas a solicitação inicial e não uma solicitação reescrita, use uma condição como:

RewriteCond %{ENV:REDIRECT_STATUS} ^$

Isto simplesmente verifica se a variável de ambiente REDIRECT_STATUS está vazia - o que está no pedido inicial. Após o primeiro sucesso reescrita , ele é definido como "200" (como no status HTTP 200 OK).

Altere o R para R=301 se esse for um redirecionamento permanente, mas somente depois de confirmar que está funcionando OK.

Você também deve evitar adicionar suas próprias diretivas personalizadas ao bloco # BEGIN WordPress , pois elas podem ser substituídas pelo próprio WordPress. Em vez disso, essas diretivas devem ser escritas antes do bloco # BEGIN WordPress , junto com seu redirecionamento HTTP para HTTPS (que também não é um redirecionamento - você precisa o sinalizador R no RewriteRule ).

    
por 20.07.2018 / 00:50