htaccess reescreve cond para reescrever erros 404 em URLs excluídas

1

Eu tenho esse problema com meu arquivo .htaccess .

O Google tem alguns URLs indexados que eu não quero (erro 404) nas Ferramentas do Google para webmasters.

Eu preciso reescrever URLs que incluam -- , /- ou uma finalização em - da seguinte forma:

  1. substitua -- por -
  2. remova o - após o /
  3. remova o final -

... mas apenas se o URL não contiver product_info.php .

Eu tentei com isso, mas não está funcionando ...

RewriteCond %{REQUEST_URI} !^/product_info\.php(.*)$
RewriteRule ^(.*)--(.*)$ /$1-$2 [L,R=301]
RewriteRule ^(.*)/-(.*)$ /$1/$2 [L,R=301]
RewriteRule ^(.*)-$ /$1$2 [L,R=301]

Está em uma Loja de comércio eletrônico Magento com o cache de verniz ativado.

Editar # 1:

Sim, eles aparecem no relatório de erros 404!

Por não trabalhar, quero dizer: O Magento diz "Este documento foi movido para cá". Se eu clicar lá, há um "erro ESI Block"

Pode haver coisas após o product_info.php?product=TestProduct--Green--XXL

Nesse caso, não quero substituir o -- to - = > esse é o problema que eu penso.

Editar # 2:

Aqui está o .htaccess completo. Eu removi os comentários e esperava que os redirecionamentos estivessem tentando funcionar por causa do espaço em lote.

DirectoryIndex index.php
<IfModule mod_php5.c>
    php_value memory_limit 6144M
    php_value max_execution_time 18000
    php_flag magic_quotes_gpc off
    php_flag session.auto_start off
    php_flag suhosin.session.cryptua off
    php_flag zend.ze1_compatibility_mode Off
</IfModule>
<IfModule mod_security.c>
    SecFilterEngine Off
    SecFilterScanPOST Off
</IfModule>
<IfModule mod_deflate.c>
</IfModule>
<IfModule mod_ssl.c>
    SSLOptions StdEnvVars
</IfModule>
<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine on
    RewriteCond %{REQUEST_URI} ^/rma/
    RewriteRule ^ - [L]

#RewriteCond %{REQUEST_URI} !^/product_info(.*)     
#RewriteRule ^(.*)--(.*)$ /$1-$2 [L,R=301]
#RewriteCond %{REQUEST_URI} !^/product_info(.*)     
#RewriteRule ^(.*)/-(.*)$ /$1/$2 [L,R=301]
#RewriteCond %{REQUEST_URI} !^/product_info(.*)     
#RewriteRule ^(.*)-$ /$1$2 [L,R=301]



    RewriteRule ^api/rest api.php?type=rest [QSA,L]
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    RewriteCond %{REQUEST_METHOD} ^TRAC[EK]
    RewriteRule .* - [L,R=405]

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteRule .* index.php [L]

</IfModule>
    AddDefaultCharset Off
<IfModule mod_expires.c>
    ExpiresDefault "access plus 1 year"
</IfModule>
    Order allow,deny
    Allow from all
    <Files RELEASE_NOTES.txt>
        order allow,deny
        deny from all
    </Files>
    <Files cron.php>
        Order allow,deny
        Deny from all
    </Files>
    
por Coach 31.08.2016 / 14:23

1 resposta

0

A diretiva RewriteCond aplica-se apenas ao single RewriteRule que a segue. Então, você precisa repetir essa condição para cada regra. Por exemplo:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_URI} !^/product_info\.php
RewriteRule (.*)--(.*) /$1-$2 [L,R=301]

RewriteCond %{REQUEST_URI} !^/product_info\.php
RewriteRule (.*)/-(.*) /$1/$2 [L,R=301]

RewriteCond %{REQUEST_URI} !^/product_info\.php
RewriteRule (.*)-$ /$1 [L,R=301]

Como alternativa, você pode incluir uma única exceção no início das regras para evitar qualquer reescrita do arquivo /product_info.php . Mas isso depende do resto do seu arquivo .htaccess, já que excluirá /product-info.php de ser reescrito. Por exemplo:

RewriteRule ^product_info\.php$ - [L]

Também removi o (.*)$ no CondPattern - que é supérfluo neste exemplo. Assim como as âncoras quando você tem um padrão cacth-all .* (ganancioso por padrão).

Verifique se todos os seus caches estão limpos antes de testar. Geralmente, é mais fácil testar com um redirecionamento 302 (temporário), pois eles não são (ou não devem ser) armazenados em cache.

    
por 31.08.2016 / 16:27