web-dev-qa-db-fra.com

mod_rewrite vide QUERY_STRING si vous commencez par un nombre

J'ai un script de requête de base de données simple à côté de mon installation WordPress, auquel je passe un paramètre en utilisant l'URL suivante: http://example.com/db/?p=foo.

Mon script de base de données lit le paramètre avec

$pid = $_GET['p'];

Tout fonctionne correctement, SI le paramètre ne commence pas par un nombre.

donc, ?p=foo est ok, mais ?p=3poo est VIDE.

Edit: je l’ai confirmé en changeant mon script en

<?php
print_r($_GET);
exit;

ce qui donne comme sortie

Array ( )

Je soupçonne que c'est le mod_rewrite qui supprime les paramètres commençant par un nombre. Mais je ne sais pas pourquoi et comment je peux changer ce comportement. Des idées?

Edit: Malheureusement, je ne peux pas changer le nom du paramètre 'p', ni les valeurs du paramètre afin qu'elles ne commencent pas par des nombres, car les URL ont déjà été publiées en tant que balises QR au public. besoin d’une solution de contournement pour que cette URL exacte fonctionne.

Voici mon fichier .htaccess dans le dossier racine (édité comme suggéré par MrWhite, fonctionne comme prévu)

<IfModule mod_rewrite.c>

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

</IfModule>
1
nounours

Grâce à Tom, j'ai regardé plus attentivement les plugins.

Et je peux confirmer que le problème n'est PAS LIÉ à mod_rewrite, mais à un conflit de plug-ins. (Désolé d'avoir posté un tel soupçon, mais j'ai lu quelque part un problème très similaire qui a été expliqué comme ça.)

En désactivant plugin par plugin, j’ai trouvé que vous aviez ce comportement. On ne sait toujours pas pourquoi, mais au moins j'ai maintenant une solution de contournement: désactiver ce plugin.

Merci Tom et tous les autres pour votre aide!

3
nounours

Enfin, complètement compris et résolu le problème en utilisant le conseil de @MrWhite d'utiliser mod_rewrite pour réécrire la requête. Merci!

Expliquer:

1) Mon http://example.com/db/?p=foo est (et je ne m'en suis pas rendu compte) de ne pas accéder à dbquery script .php, mais une page wordpress "db", qui appelle le script dbquery.php en utilisant le plugin "INCLUDEME".

2) Donc, la chaîne de requête est d'abord traitée par Wordpress (ou autre chose, je ne connais pas le bon terme), et puisque - comme @Tom J Nowell l'a souligné - mon paramètre "p" a une signification particulière, il a été vidé par "Wordpress", et déjà aucune chaîne de requête ne l'a fait au plugin. Ce n'était donc pas la faute des plugins.

3) Conclusion: pas le mod_rewrite, ni le plugin, ni la valeur commençant par un nombre n'était le problème, mais le simple fait que j'ai utilisé "p" était la source du problème.

4) La solution consistait à:

a) renommer la page de travail "db" en "nachverfolgbarkeit"

b) créer un répertoire appelé "db"

c) placez un fichier .htaccess dans la base de données contenant la redirection ci-dessous, pour rediriger de la base de données vers la nouvelle page "nachverfolgbarkeit" (qui appelle dbquery.php à l'aide de INCLUDEME); et corriger le paramètre de "p" à "pid"

Pas très joli patch, mais ça marche bien. Donc, mon conseil à tous les lecteurs: "Ne jamais utiliser p comme nom de paramètre" ...

Merci à tous pour leur aide. Nounours

RewriteEngine On
RewriteCond %{QUERY_STRING} ^p=(.*)$
RewriteRule ^$ /nachverfolgbarkeit/?pid=%1   [R=301]
2
nounours