Maison > Questions et réponses > le corps du texte
.htaccess
Il y a un problème avec la réécriture des règles. Transmettez l'URL de l'e-mail de l'utilisateur au navigateur qui contient le jeton de réinitialisation du mot de passe.
Règles .htaccess
actuelles :
Options +FollowSymLinks -MultiViews RewriteEngine On RewriteBase / RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\.DOMAIN\.com [NC] RewriteRule ^(.*)$ https://DOMIAN.com/ [L,R=301] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ .php [L] RewriteCond %{THE_REQUEST} ^(?:GET|POST)\ /.*\.php\ HTTP.*$ [NC] RewriteRule ^(.*)\.php$ [R=301,L]
Quand l'utilisateur essaie de partir
example.com/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6
Produit ces erreurs lors du débogage
example.com/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6.php.php.php.php.php.php.php.php.php.php
J'ai donc suivi les commentaires ci-dessous et mis à jour .htaccess comme suit :
Options +FollowSymLinks -MultiViews RewriteEngine On RewriteBase / RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\.EXAMPLE\.com [NC] RewriteRule ^(.*)$ https://EXAMPLE.com/ [L,R=301] RewriteCond %{THE_REQUEST} ^(?:GET|POST)\ /.*\.php\ HTTP.*$ [NC] RewriteRule ^(.*)\.php$ [R=301,L] # Rewrite extensionless ".php" URLs RewriteCond %{DOCUMENT_ROOT}/.php -f RewriteRule (.+) .php [L] # Rewrite "/<file>/<code>" to "/<file>.php/<code>" RewriteCond %{DOCUMENT_ROOT}/.php -f RewriteRule ^([^/]+)/([a-f0-9])$ .php/ [L]
J'obtiens l'erreur suivante :
AH00128 : Le fichier n'existe pas : /var/www/html/htdocs/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6
P粉6511093972024-03-20 21:37:57
Le problème avec cette règle est que vous vérifiez un chemin de système de fichiers (c'est-à-dire %{REQUEST_FILENAME}.php
)并重写到另一个文件系统路径(.php
)。这些不一定指同一件事。对于对 /activate/foo
的请求,其中 activate
不是文件系统目录,则 REQUEST_FILENAME
的格式为 /var/www/html/htdocs/activate
(因此文件检查成功,因为 /var/www/html/ htdocs/activate.php
存在),但它将请求重写为 activate/foo.php
(使用 反向引用) - 该请求不存在。它将重复执行此操作,每次附加
.php
(jusqu'à ce que la limite de réécriture interne soit atteinte ; par défaut 10).
Aside #1 : Pas besoin de vérifier si la requête est mappée sur un répertoire et non sur un fichier avant de vérifier si request+.php
est mappée sur un fichier. Cela représente 3 vérifications (coûteuses) du système de fichiers alors qu'une seule est nécessaire.
Aside #2 : Vous n'avez pas non plus besoin d'une barre oblique inverse pour échapper aux points littéraux dans TestString (le premier argument), car il s'agit d'une chaîne "normale", pas d'une expression régulière.
Cette règle doit être corrigée afin que vous testiez les mêmes chemins de fichiers que vous finissez par réécrire. Par exemple :
# Rewrite extensionless ".php" URLs RewriteCond %{DOCUMENT_ROOT}/.php -f RewriteRule (.+) .php [L]
Vous avez ensuite besoin d'une règle supplémentaire pour transmettre la requête /activate/
重写为
/activate.php/
(将
/
comme information de chemin vers votre script). S'il s'agit d'un cas isolé, cela peut être "codé en dur". Par exemple :
# Rewrite "/activate/" to "/activate.php/"
RewriteRule ^(activate)/([a-f0-9]+)$ .php/ [L]
(Je suppose que est une séquence hexadécimale, ce qui semble être le cas dans votre exemple.)
Ou si vous avez une demande similaire, rendez-la plus générique. Par exemple. /<文件>/
到
/<文件>.php/
. Par exemple :
# Rewrite "// " to "/
.php/ " RewriteCond %{DOCUMENT_ROOT}/.php -f RewriteRule ^([^/]+)/([a-f0-9]+)$ .php/ [L]
Narration :
Cette règle (redirection externe) devrait précéder la réécriture ci-dessus.