web-dev-qa-db-fra.com

Rediriger temporairement WordPress url avec la chaîne de requête du répertoire racine vers la nouvelle url

Ce post semble avoir ma réponse:
Comment puis-je rediriger l'ancienne WordPress URL (avec une chaîne de requête) vers une nouvelle URL à l'aide de .htaccess?

Cependant, cela ne semble pas fonctionner correctement avec les règles de réécriture précédentes de WordPress. Ce que je voudrais faire est une redirection temporaire (302) à partir de cette page: https://example.com/?post_type=email#038;p=14207 vers cette page: https://example.com/email/fall-2017/

Voici les règles mod_rewrite pertinentes dans mon fichier .htaccess et leur ordre:

# 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 Query String URL redirects
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^/$
    RewriteCond %{QUERY_STRING} ^post_type=email#038;p=14207$
    RewriteRule .* https://example.com/email/fall-2017/? [R=302,L]
</IfModule>
# END Query String URL redirects

Une deuxième paire d'yeux est très appréciée!

5
emRae

Je pense que vous avez deux problèmes.

Premièrement, les réécritures sont vérifiées dans l’ordre et vous mettez la plus contraignante après la moins contraignante (c’est-à-dire que la redirection avec votre chaîne de requête doit être la première.)

Deuxièmement, nous avons un autre problème concernant la chaîne de requête. Il comprend une ancre. Cela n'est jamais envoyé au serveur (tout ce qui suit #... ne concerne que le client.)

Ainsi, la réécriture ne peut pas prendre ce hachage en compte, elle ne sera pas transmise au serveur et ne pourra donc pas être vérifiée. Cependant, il semble qu'il y ait des informations importantes, donc je ne pense pas que vous puissiez le faire correctement à moins que vous sachiez comment il est converti avant qu'il ne soit envoyé au serveur. Une possibilité serait qu'il soit écrit sous la forme% 23.

Maintenant, pour que vous ayez une bonne idée, vous devriez regarder dans les journaux et voir ce que vous obtenez là-bas quand cette page est affichée.

Ici, j'ai un exemple de ce que vous pouvez voir.

smsfromme.com:443 173.14.79.185 - - [14/Sep/2017: 01: 38: 36 +0000] "GET/api/1/message/next HTTP/1.1" 404 141 "smsfromme.com" "-" " Dalvik/1.6.0 (Linux; U; Android 4.4.2; Construction SM-G386T/KOT49H) "TLSv1 ECDHE-RSA-AES128-SHA

La chaîne de requête apparaît après le chemin, vous devriez donc voir un GET suivi de quelque chose comme:

"GET /?post_type=email#038;p=14207" ...

Ou comme je soupçonne de donner les informations que vous nous avez données, ceci:

"GET /?post_type=email" ...

Et si votre redirection fonctionne, le code après le chemin sera 302.

Il est très probable que votre code JavaScript prenne l'ancre (les données après le #) et le convertisse en un GET pour les données de la page (c'est-à-dire généralement appelé une demande AJAX.) C'est une bonne astuce pour éviter de recharger toute la page à chaque fois. Mais cela rend plus difficile de "Tweak" avec un fichier .htaccess.

4
Alexis Wilke

Alexis Wilke a vraiment découvert les problèmes. Outre le fait que #038; dans l'URL est le code html de &. Il vient juste d'être automatiquement converti dans le courrier électronique et est donc passé à la mauvaise URL.

J'ai résolu ce problème en utilisant le plugin WordPress plugin Quick Page/Post Redirect . Les parties url sur lesquelles j'ai effectué la redirection étaient les suivantes: /?post_type=email to /email/fall-2017/.

Je ne pouvais pas faire la regex ou le formatage correctement pour que cela fonctionne dans le fichier .htaccess et je pense que le plug-in sait comment coder cette chaîne de requête plus précisément. Tant que je n'aurai pas amélioré mon niveau regex, je continuerai à utiliser le plugin pour les redirections.

1
emRae

J'ai résolu ce problème en utilisant le plugin WordPress _ Quick Page/Post Redirect. Les parties url sur lesquelles j'ai effectué la redirection étaient les suivantes: /?post_type=email to /email/fall-2017/.

Je ne pouvais pas faire la regex ou le formatage correctement pour que cela fonctionne dans le fichier .htaccess

Le code/regex requis est très similaire (mais encore plus simple) à ce que vous avez posté au départ, mais il faut juste y aller avant le WordPress contrôleur-avant (comme le suggère @AlexisWilke).

Par exemple:

# Special redirects
RewriteCond %{QUERY_STRING} ^post_type=email$
RewriteRule ^$ /email/fall-2017/? [R=302,L]

# 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

Pas besoin de l'encapsuleur <IfModule> ni de la directive supplémentaire RewriteEngine. Et pas besoin de la directive RewriteCond qui vérifie la variable serveur REQUEST_URI - cette vérification s’effectue mieux dans la RewriteRulemodèle ie. ^$ (chemin d'URL vide).

1
MrWhite