1 votes

Htaccess réécrit la condition pour la réécriture des erreurs 404 sur les URL exclues

J'ai ce problème avec mon fichier .htaccess.

Google a indexé quelques URL que je ne veux pas (Erreur 404) dans les Outils pour webmasters.

J'ai besoin de réécrire des URL qui incluent --, /- ou se terminant par - comme ceci :

  1. remplacer -- par -
  2. supprimer le - après le /
  3. supprimer le - final

... mais seulement si l'URL ne contient pas product_info.php.

J'ai essayé avec ceci mais ça ne fonctionne pas...

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

C'est sur une boutique Ecommerce Magento avec le cache Varnish activé.

Édition #1 :

Oui, elles apparaissent dans le rapport d'erreur 404 !

Quand je dis que ça ne fonctionne pas : Magento dit "Ce document a été déplacé ici". Si je clique là, il y a une erreur de "Bloc ESI".

Il peut y avoir du contenu après le product_info.php?product=TestProduct--Green--XXL

Dans ce cas, je ne veux pas remplacer le -- par - => c'est le problème je pense.

Édition #2 :

Voici le .htaccess complet. J'ai supprimé les commentaires sauf les redirections que j'essaie de faire fonctionner en raison de l'espace.

DirectoryIndex index.php

    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

    SecFilterEngine Off
    SecFilterScanPOST Off

    SSLOptions StdEnvVars

    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]

    AddDefaultCharset Off

    ExpiresDefault "access plus 1 year"

    Order allow,deny
    Allow from all

        order allow,deny
        deny from all

        Order allow,deny
        Deny from all

0voto

MrWhite Points 11269

La directive RewriteCond s'applique uniquement à la seule RewriteRule qui la suit. Par conséquent, vous devez répéter cette condition pour chaque règle. Par exemple :

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]

Alternativement, vous pouvez inclure une exception unique au début des règles pour éviter toute réécriture du fichier /product_info.php. Cependant, cela dépend du reste de votre fichier .htaccess, car il exclura /product-info.php de toute réécriture. Par exemple :

RewriteRule ^product_info\.php$ - [L]

J'ai également supprimé le (.*)$ final sur le CondPattern - cela est superflu dans cet exemple. De même que les ancres lorsque vous avez un motif .* qui attrape tout (gourmand par défaut).

Assurez-vous que tous vos caches sont vides avant de tester. Il est souvent plus facile de tester avec une redirection 302 (temporaire), car celles-ci ne sont pas (ou ne devraient pas être) mises en cache.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X