2 votes

Les variables Get deviennent inaccessibles après la réécriture du htaccess

J'essaie de travailler avec des urls compatibles avec le référencement et j'utilise donc htaccess pour rediriger vers une destination plus conviviale. Cependant, lorsque je fais ces redirections, je ne suis plus en mesure d'accéder aux variables get de la nouvelle url, même si je peux les obtenir lorsque je vais à l'ancienne url. Je regarde spécifiquement la ligne "writer", mais j'ai inclus le reste pour le contexte. Une idée sur la façon de résoudre ce problème ?

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]
RewriteRule ^writer/([0-9a-zA-z_-]+) writer?user=$1 [QSA,L]
RewriteRule ^article/([0-9a-zA-z_-]+)/([0-9a-zA-z_-]+) article?id=$1&title=$2 [QSA,L]

0voto

MrWhite Points 11269

Il semblerait que les vues multiples soient activées. Puisque vous avez writer dans l'URL et writer.php (même nom de base) que le fichier vers lequel il est réécrit, vous devez vous assurer que MultiViews (qui fait partie de mod_negotiation) est désactivé, sinon MultiViews émettra une sous-demande interne de writer.php (sans paramètres URL) vor vos directives mod_rewrite sont en mesure de traiter la demande.

En haut de votre .htaccess fichier :

Options -MultiViews
RewriteRule ^writer/([0-9a-zA-z_-]+) writer?user=$1 [QSA,L]

Vous devez également réécrire directement dans le fichier qui traite la demande. Avec la directive ci-dessus, vous dépendez d'une autre directive qui réécrit la requête (lors d'une deuxième passe) pour ajouter l'extension de fichier nécessaire.

En d'autres termes :

RewriteRule ^writer/([0-9a-zA-z_-]+) writer.php?user=$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]

Et modifier l'ordre des directives, de sorte que la règle "fourre-tout" consistant à ajouter l'extension du fichier soit placée en dernier. Cependant, vous ne pouvez pas réécrire vers un chemin absolu du système de fichiers dans la directive .htaccess Il doit s'agir d'un chemin d'accès URL, ce qui implique d'utiliser REQUEST_URI au lieu de REQUEST_FILENAME で、その RewriteRule substitution . Par exemple :

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !\.php$ %{REQUEST_URI}.php [QSA,L]

Cependant, en fonction de la structure de votre système de fichiers, REQUEST_FILENAME y REQUEST_URI ne renvoient pas nécessairement au même chemin d'accès à l'URL. Il peut donc être plus sûr d'utiliser REQUEST_URI で、その condition également. Par exemple :

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
RewriteRule !\.php$ %{REQUEST_URI}.php [QSA,L]

Vous pouvez également exclure les requêtes qui contiennent une extension de fichier, comme vos ressources statiques (images, css, js). Dans l'état actuel des choses, il y aura un système de fichiers (relativement coûteux) pour chacune de ces requêtes.

En résumé :

Options -MultiViews

RewriteEngine On

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

RewriteRule ^writer/([0-9a-zA-z_-]+) writer.php?user=$1 [QSA,L]
RewriteRule ^article/([0-9a-zA-z_-]+)/([0-9a-zA-z_-]+) article.php?id=$1&title=$2 [QSA,L]

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
RewriteRule !\.php$ %{REQUEST_URI}.php [QSA,L]

UPDATEです:

.htaccess se trouve dans public_html tandis que writer.php se trouve dans un dossier sous public_html appelé users.

Si writer.php est situé dans le /users alors vous devrez évidemment faire référence à ce sous-répertoire quelque part, soit dans la directive ( susbstitution ) elle-même, ou peut-être en utilisant une chaîne de caractères RewriteBase si tous les fichiers réécrits se trouvent dans ce sous-répertoire.

Par exemple :

RewriteRule ^writer/([0-9a-zA-z_-]+) users/writer.php?user=$1 [QSA,L]

Depuis l'entrée en vigueur de la .htaccess est situé à la racine du document, alors la directive ci-dessus suppose que vous faites une demande de la forme /writer/abc . Si la demande concerne effectivement /users/writer/abc vous devrez alors modifier le RewriteRule modèle en conséquence (ou déplacer le .htaccess dans le fichier /users mais il ne faut pas modifier le sous-répertoire substitution chaîne de caractères).

Il convient de noter qu'un substitution chaîne de caractères (ie. users/writer.php?user=$1 ) sans barre oblique (ou schéma + nom d'hôte) est considéré comme un relatif . Elle est relative à l'emplacement de la .htaccess à moins qu'un fichier RewriteBase est défini qui stipule le contraire.

(Depuis writer.php était apparemment appelé à l'origine, sans aucun paramètre d'URL, alors il semble que vous faisiez peut-être une requête de la forme /users/writer/abc ?)

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