web-dev-qa-db-fra.com

Comment créer une redirection dans le fichier .htaccess, à deux exceptions près

Donc, j'essaye cela depuis longtemps, mais je n'arrive pas à le faire fonctionner. Prétendez que mon site Web est https://example.com, avec les pages supplémentaires https://example.com/abc et https://example.com/abc-def-g. Il est prévu que toutes les pages, qu'elles existent ou non, soient automatiquement redirigées vers la page d'accueil, à l'exception des deux pages répertoriées ci-dessus.

Tout ce que j'ai essayé a échoué, que ce soit pour m'empêcher d'accéder au site Web ou pour ne rien faire du tout. J'essaie donc de recommencer à zéro.

C'est le fichier .htaccess en ce moment:

# BEGIN WordPress
<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
# BEGIN EWWWIO
# END EWWWIO

Ceci est le fichier standard pour WordPress. Toute aide serait très appréciée!

1
N.Hyatt

Essayez ce qui suit, before les directives WordPress existantes:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !^(abc|abc-def-g)$ / [R,L]

Cela indique que pour toute URL autre que /abc ou /abc-def-g et qui ne correspond pas à un fichier ou à un répertoire physique (c'est-à-dire vos ressources statiques, vos images, CSS, JS, etc.), redirigez-la ensuite vers la page d'accueil.

Le préfixe ! sur la RewriteRule pattern annule la regex.

Ceci est une redirection temporaire (302).

Vous n'avez pas besoin de répéter la directive RewriteEngine On.


UPDATE: Si vos URL se terminent par une barre oblique finale, vous devez modifier la variable RewriteRule pattern :

RewriteRule !^(abc|abc-def-g)/$ / [R,L]

Ou, rendre la barre oblique finale facultative:

RewriteRule !^(abc|abc-def-g)/?$ / [R,L]

Une autre façon d’écrire la même chose est (comme vous l’avez mentionné dans les commentaires) d’utiliser les directives RewriteCond pour vérifier la variable serveur REQUEST_URI au lieu de RewriteRule pattern . Cela pourrait être plus facile à lire, cependant, il est légèrement moins efficace puisque RewriteRule pattern est toujours traité en premier. Par exemple:

RewriteCond %{REQUEST_URI} !^/abc/?$
RewriteCond %{REQUEST_URI} !^/abc-def-g/?$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ / [R,L]

Quel est le même que (en alternance):

RewriteCond %{REQUEST_URI} !^/(abc|abc-def-g)/?$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ / [R,L]
0
MrWhite