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
?)