"ErrorDocument 404 dans .htaccess est incompatible avec RewriteRule, entraînant une défaillance fonctionnelle"
P粉320361201
P粉320361201 2024-01-10 16:56:14
0
1
327

.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粉320361201
P粉320361201

répondre à tous(1)
P粉605233764

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal