Maison  >  Questions et réponses  >  le corps du texte

Problème de règle de réécriture .htaccess

.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粉316890884P粉316890884237 Il y a quelques jours398

répondre à tous(1)je répondrai

  • P粉651109397

    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.

    répondre
    0
  • Annulerrépondre