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

"ErrorDocument 404 dans .htaccess est incompatible avec RewriteRule, entraînant une défaillance fonctionnelle"

.htaccess ErrorDocument 404 Aucune redirection lors de l'utilisation de règles de réécriture. Une erreur de serveur interne 500 se produit.

Non RewriteRule 时,ErrorDocument fonctionne correctement.

Mon code

RewriteEngine On 
   <IfModule mod_rewrite.c>
   RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.*)$ /stores/  [NC,L]
   ErrorDocument 404 /404.html
  </IfModule>

P粉320361201P粉320361201306 Il y a quelques jours301

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

  • P粉605233764

    P粉6052337642024-01-11 09:26:16

    Le "problème" avec cette règle est que si vous demandez un fichier qui n'existe pas et que le fichier n'existe pas dans le sous-répertoire /subdirectory/, cela provoquera une boucle de réécriture infinie (d'où le 500 Internal Server que vous voir Erreur) car il tente la réécriture suivante :

    • /n'existe pas (demande initiale)
    • /stores/not-exists (première réécriture)
    • /stores/stores/not-exists (deuxième réécriture)
    • /stores/stores/stores/not-exists (troisième réécriture)
    • Attendez.

    Vous n'avez pas réellement précisé ce que vous essayiez d'atteindre, mais je suppose que /stores est un sous-répertoire "caché" et que vous aviez l'intention d'écraser les fichiers réels dans le sous-répertoire /stores. C'est la seule manière pour qu'une telle règle fonctionne avec la directive ErrorDocument 404 définie dans Apache.

    Ainsi, lors de la réécriture dans le sous-répertoire /stores, vous devez d'abord vérifier si la requête sera mappée à un fichier réel avant d'émettre la réécriture. De cette façon, toute demande concernant un fichier qui n'existe pas et n'est pas mappé au sous-répertoire /stores sera transmise au 404 ErrorDocument défini par Apache.

    Par exemple, essayez d'utiliser le code suivant :

    ErrorDocument 404 /404.html
    
    RewriteEngine On 
    
    # 如果该目录中存在文件,则将请求重写到“/stores”目录
    RewriteCond %{DOCUMENT_ROOT}/stores/ -f
    RewriteRule (.+) stores/ [L]
    
    # (可选)将根目录的请求重写为“/stores/”
    RewriteRule ^$ stores/ [L]

    Pas besoin de conteneur <IfModule> (mais vous mettez la directive RewriteEngine en dehors de ce conteneur, ce qui n'a aucun sens).

    Si le fichier .htaccess se trouve à la racine du document, la directive RewriteBase n'est pas nécessaire.

    Structurellement, il est préférable de définir d'abord ErrorDocument.

    répondre
    0
  • Annulerrépondre