【问题标题】:ErrorDocument 404 for a multi-lingual site多语言站点的 ErrorDocument 404
【发布时间】:2016-11-04 11:52:49
【问题描述】:

我遇到了一个小问题,导致我的网站出现冲突。例如当我在这个页面上/en/pagenotexists/时,我怎么能简单地引用/en/404.php

我在 .htaccess 中使用以下指令:

ErrorDocument 404 /404.php

我尝试了这个解决方案,但根本没有用:

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

【问题讨论】:

  • 当你请求 /en/pagenotexists/ 时服务器会做什么?
  • 感谢您的留言。假设默认语言是“fr”,如果我请求“/en/pagenotexists/”,页面将以法语加载,我希望它以英语显示
  • 你的意思是“如果你请求 /en/notexist 它应该加载 /en/404.php/fr/notexist 应该加载 /fr/404.php ?
  • 是的,这就是我想要的:)

标签: .htaccess redirect multilingual errordocument


【解决方案1】:

要使用正确的404 状态代码显示特定于语言的404.php 的内容,您可以使用此内部重写规则:

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

然后将您的/en/404.php 设为:

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

// rest of the 404 handler content
?>

【讨论】:

  • 哦,太棒了,我会试试看 :) 你的意思是在 $1 之前省略前导斜杠吗?谢谢
  • 您可以在 $1 之前放置前导斜杠,但如果 .htaccess 在站点根目录中,则不会有任何区别。
  • 是的,它运行良好,谢谢 :) 但我现在面临另一个相关问题,我会尝试解决它,如果我无法解决,我会告诉你;)
【解决方案2】:

您需要删除 R=404 :

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

否则规则会将请求重定向到默认的 404 页面而不是规则的目标。

【讨论】:

  • 你给我的东西没有用,但它适用于这个指令:RewriteRule ^([a-z]{2}) /$1/error-404/ [QSA,L](删除斜线并使用 QSL)!但是如果我删除 R=404,我会阻止 apache 发送 404 标头,对吗?
  • 是的,这是真的。您将无法收到 404 标头,而是会收到 302 响应。
  • 不接收 404 标头也无所谓吗? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多