2016-11-04 4 views
2

Bonjour à tous, je suis confronté à un petit problème qui provoque un conflit sur mon site. quand je suis par exemple sur cette page/en/pagenotexists/comment puis-je simplement refere a /fr/404.php? J'utilise la directive suivante dans mon .htaccess:ErrorDocument 404 pour un site multilingue

ErrorDocument 404 /404.php 

J'ai essayé cette solution, mais ne fonctionne pas du tout:/

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteRule ^([a-z]{2})/ /$1/404.php [R=404,L] 

Merci beaucoup pour votre aide

+0

Que fait le serveur lorsque vous demandez **/en/pagenotexists/**? – starkeen

+0

merci pour votre message. Disons que la langue par défaut est "fr", si je demande "/ fr/pagenotexists /" la page se chargera en français, et je voudrais l'afficher en français – Websphere

+0

Voulez-vous dire "si vous demandez **/en/notexist ** il devrait charger **/fr/404.php ** et **/fr/notexist ** devrait charger **/fr/404.php **? – starkeen

Répondre

0

Pour afficher le contenu de lang 404.php spécifique avec le code correct 404 d'état, vous pouvez utiliser cette règle de réécriture interne:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([a-z]{2})/ $1/404.php [L] 

Faites ensuite votre /en/404.php comme ceci:

<?php 
// return correct 404 status code 
http_response_code(404); 

// rest of the 404 handler content 
?> 
+1

Oh cool, je vais essayer :) avez-vous voulu omettre la barre oblique avant 1 $? Merci – Websphere

+0

Vous pouvez mettre la barre oblique avant $ 1, mais cela ne fera aucune différence si .htaccess est dans la racine du site. – anubhava

+1

oui, cela a bien fonctionné, merci :) mais je fais face maintenant à un autre problème connexe, je vais essayer de le résoudre et je vous ferai savoir si je ne parviens pas à;) – Websphere

0

Vous devez supprimer le R = 404:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteRule ^([a-z]{2})/ /$1/404.php [R,L] 

Sinon la règle redirigera la demande vers la page 404 par défaut au lieu de la destination de la règle.

+0

ce que vous m'a donné ne fonctionnait pas, mais il fonctionne avec cette directive: 'RewriteRule^([az] {2})/$ 1/error-404/[QSA, L]' (suppression de la barre oblique et utilisation de QSL)! Mais si je supprime le R = 404, j'empêcherai Apache d'envoyer les 404 en-têtes, n'est-ce pas? – Websphere

+0

Oui, c'est vrai, vous ne pourrez pas recevoir l'en-tête 404 mais vous recevrez une réponse 302. – starkeen

+0

Et ça n'a pas d'importance pas pour recevoir 404 en-têtes? :) – Websphere