Redirecionar todos os URLs para a raiz, exceto / wp-admin e wp-json

4

Eu tento redirecionar todos os URLs para a raiz, exceto para a administração wordpress e a API REST wordpress.

Eu tenho estas regras no meu .htaccess :

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/wp-admin.*
RewriteCond %{REQUEST_URI} !^/wp-json.*
RewriteRule ^.*$ / [L,R=301]
</IfModule>

Funciona perfeitamente para todos os redirecionamentos esperados para a rota /wp-json onde recebo erros 404.

Além disso, tenho esses tipos de erros no meu arquivo de log do Apache: File does not exist: [...]/dmjob/wp-json, referer: http://dmjob.dev:8888/

Você pode por favor me ajudar? Muito obrigado ! :)

    
por Quentin Brosse 31.05.2017 / 12:08

2 respostas

3

Você parece ter destruído o front-controller do WordPress, portanto, as solicitações para /wp-admin e /wp-json não serão roteadas corretamente (por isso, as 404s que você está vendo).

Você deve deixar as diretivas do WP como estavam, mas implemente um redirecionamento adicional no início do arquivo. Por exemplo:

# Redirect all requests for non-existent files and those not for wp-admin or wp-json
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/wp-admin
RewriteCond %{REQUEST_URI} !^/wp-json
RewriteRule ^ / [R=301,L]

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Observe que, como no código original, a solicitação é redirecionada apenas ao solicitar um arquivo inexistente, mesmo que esse arquivo esteja fora do espaço de URL /wp-admin e /wp-json . (Presumivelmente isso é necessário para que CSS, JS, imagens e quaisquer outros recursos estáticos ainda sejam exibidos corretamente.)

    
por 31.05.2017 / 12:53
0

Vamos ver o que suas regras estão fazendo.

  1. Você habilita o mecanismo de regravação para definir o URL base para as regravações por diretório. Tudo bem.

    RewriteEngine On
    RewriteBase /
    
  2. Em seguida, você afirma que nenhuma legenda - deve ser feita para /index.php . Tudo bem também.

    RewriteRule ^index\.php$ - [L]
    
  3. O restante das condições faz com que a regra na última linha seja aplicada.

    O redirecionamento para / é feito sempre que o arquivo ou diretório não existir ou o URL de solicitação não for /wp-admin.* ou /wp-json.* :

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !^/wp-admin.*
    RewriteCond %{REQUEST_URI} !^/wp-json.*
    RewriteRule ^.*$ / [L,R=301]
    

Não há nada de errado com nada disso. O url http://example.com/wp-json/ e qualquer coisa abaixo não atendem à última condição e o RewriteRule não é aplicado.

O erro 404 Not Found é uma indicação de que você não tem o /wp-json . O erro (legível por humanos) nos seus registros sugere o mesmo. Se você não tiver a última regra, as duas primeiras regras de arquivos não existentes teriam sido atendidas, causando o redirecionamento para o / . Ter a última regra impede esse redirecionamento, causando 404 .

    
por 31.05.2017 / 13:04