web-dev-qa-db-fra.com

Redirige toutes les pages sauf une vers la page d'accueil via .htaccess

Je viens de transformer un ancien site Web en un Wordpress d'une page.

L'ancien site Web avait plusieurs URL, maintenant il n'y a plus qu'un: la page d'accueil. Plus une autre page avec politique de confidentialité.

Par conséquent, je voudrais rediriger toutes les URL, sauf celle avec slug "privacy" vers la page d'accueil.

C'est ce que j'essaye, sans succès:

#custom redirects
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/privacy-policy/
RewriteRule (.*) http://www.mywebsite.com/$1 [R=301,L]
</IfModule>

# BEGIN WordPress (standard wp htaccess rules)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Je reçois trop de redirection: toutes les URL redirigent infiniment vers elles-mêmes, pourquoi?

serait-il préférable (si possible) d'utiliser une règle de redirection au lieu d'une réécriture?

MISE À JOUR

suggestion de commentaires suivante, j'ai essayé les redirections personnalisées suivantes (avant WP):

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/privacy-policy$
RewriteRule (.*) http://mywebsite.com/ [R=301,L]
</IfModule>

Mais ne fonctionne toujours pas

1
bluantinoo

Problèmes

Je reçois trop de redirection: toutes les URL redirigent infiniment vers elles-mêmes, pourquoi?

Les règles de réécriture Apache sont traitées de haut en bas, donc votre règle de réécriture personnalisée est toujours traitée en premier. L'indicateur de redirection R demande à Apache de dire au navigateur de faire une nouvelle demande à l'URL modifiée au lieu de servir la destination de la réécriture à l'adresse actuelle, et l'indicateur L "last" indique Apache pour ignorer toutes les règles de réécriture en cours - donc chaque fois que votre RewriteRule est appliqué, une nouvelle demande est faite et vos règles sont à nouveau traitées à partir du haut.

Votre RewriteCond demande à Apache de traiter la procédure RewriteRule chaque fois que le chemin de l'URI de la demande ne commence pas par /privacy-policy - donc pratiquement chaque demande entraîne une redirection avant l'une des autres règles dans votre .htaccess peut être autant évalué.

Comme @MarkKaplun y a fait allusion dans les commentaires $1 Est une référence arrière qui est remplacée par la partie de l'URI correspondant contenue dans le premier "groupe de capture" (le premier ensemble de parenthèses dans le modèle). Puisque .* Correspond littéralement à n'importe quel nombre de caractères, dans votre RewriteRule$1 Est remplacé par le chemin = entier URI.

Essentiellement, vos règles de réécriture:

RewriteCond %{REQUEST_URI} !^/privacy-policy/
RewriteRule (.*) http://www.mywebsite.com/$1 [R=301,L]

évaluer "Si l'URI ne commence pas par /privacy-policy/, demandez au navigateur Web d'envoyer une nouvelle demande à http://www.mywebsite.com/(original URI path)".

Donc, à des fins d'illustration, disons que vous avez accédé à http://www.mywebsite.com/blog/2015; voici ce qui se passe avec chaque demande:

  1. /blog/2015 Ne commence pas par /privacy-policy/, Dites au navigateur d'aller à http://www.mywebsite.com/blog/2015.
  2. /blog/2015 Ne commence pas par /privacy-policy/, Dites au navigateur d'aller à http://www.mywebsite.com/blog/2015.
  3. /blog/2015 Ne commence pas par /privacy-policy/, Dites au navigateur d'aller à http://www.mywebsite.com/blog/2015.
  4. [...]

La suppression de la référence arrière $1 De RewriteRule est insuffisante, car un chemin URI de / (Ou simplement vide) ne peut toujours pas être considéré comme commençant par /privacy-policy/, Ce qui entraîne le comportement:

  1. /blog/2015 Ne commence pas par /privacy-policy/, Dites au navigateur d'aller à http://www.mywebsite.com/.
  2. / Ne commence pas par /privacy-policy/, Dites au navigateur d'aller à http://www.mywebsite.com/.
  3. / Ne commence pas par /privacy-policy/, Dites au navigateur d'aller à http://www.mywebsite.com/.
  4. [...]

Vous pouvez vérifier ce comportement en consultant les fichiers journaux de votre installation Apache.


Solution

Si vous ne prévoyez pas d'utiliser le routage d'adresse prévu de WordPress, il n'y a aucune raison de conserver les règles de réécriture par défaut et d'en empiler davantage. Adaptez-les à vos besoins au lieu d'ajouter de la complexité:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^(/|index\.php)$ /index.php? [L]
RewriteRule ^/?privacy-policy/?$ /index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /? [L,R=301]
</IfModule>

En résumé,

  1. .

    RewriteRule ^(/|index\.php)$ /index.php? [L]

    Si / Ou index.php A été explicitement demandé, servez index.php, Mais supprimez la chaîne de requête (afin d'éviter de changer de page via la manipulation de la requête-var) et arrêtez le traitement des réécritures.

  2. .

    RewriteRule ^/?privacy-policy/?$ /index.php [L]

    Si privacy-policy (Avec ou sans barres obliques de début et de fin) a été explicitement demandé, servez index.php Et arrêtez le traitement des réécritures.

  3. .
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /? [L,R=301]
    

    Si le nom de fichier demandé n'est pas un fichier et pas un répertoire, faites correspondre un seul caractère n'importe où (afin d'appliquer la règle quel que soit l'URI) et indiquez au navigateur de faire une nouvelle demande à / Et jetez sa chaîne de requête. Arrêtez le traitement des réécritures.

Il convient de noter que le résultat escompté entraînera probablement de nombreux comportements inattendus - vous ne pourrez probablement pas accéder au tableau de bord administratif, pour commencer. Les pièces jointes peuvent également se briser. Mais ce qui précède devrait au moins fournir un bon point de départ pour en savoir plus sur les directives de réécriture.

2
bosco

S'il vous plaît essayez

<IfModule mod_rewrite.c>
RewriteRule ^/privacy-policy/? privacy-policy [L,NC]

RewriteCond %{HTTP_Host} ^(www\.)?oldsite\.com  [NC]
RewriteRule ^ http://mywebsite.com%{REQUEST_URI} [NE,R=301,L]
</IfModule>
0
Florian