【问题标题】:Display the 404 page in a multi-language website在多语言网站中显示 404 页面
【发布时间】:2015-01-30 11:51:38
【问题描述】:

我为网站创建了一个404.php 页面。此外,.htaccess 文件(在 /root 中)具有 ErrorDocument 404 /404.php 行。

该网站具有多语言功能,如下所示:

sitename.com/it/article1 
sitename.com/en/article1 

等等......有很多文章。

404.php 页面在我尝试访问 sitename.com/adsdasaerera 之类的内容时出现,但在我尝试访问 sitename.com/en/adsdasaerera 时没有出现,adsdasaerera 显然不是现有文章。

我怎样才能做到这一点?

【问题讨论】:

标签: php


【解决方案1】:

理想情况下,您应该有一个错误 404 文档页面。在该页面上,您将首先设置默认区域设置为 en,然后确定用户使用的浏览器区域设置/语言,然后继续下一步,以该语言显示错误页面。

既然我们在谈论 PHP,这里是一个如何在 PHP 中检测语言环境的答案。 Simplest way to detect client locale in PHP

从那里开始,下一步基本上是使用数组或文件中与该语言环境相关联的字符串并显示它们。

如果用户不希望在他们的浏览器设置使用的语言中阅读错误,则在此页面上您还可以有一些指向可以查看的其他翻译的链接(单击时显示 div 的隐藏元素)。

【讨论】:

    【解决方案2】:

    你试过给它一个完整的路径吗?

    ex ErrorDocument 404 /site/error/404.html
    

    【讨论】:

      【解决方案3】:

      你有没有试过把 ErrorDocument 404 /404.php 行放到 apache 全局配置文件中,可能在 /etc/httpd/. 或者 somesite.com/en/ 文件夹下是否有现有的 .htaccess 文件?

      【讨论】:

      • 我没试过。某个文件夹下没有另一个 .htaccess 文件,就在根目录下。
      【解决方案4】:

      您如何归档多语言功能?在 apache 或 .htaccess 中重写?你的 PHP 代码是什么?

      除了 Branimir Đureks 的回答外,您还可以分析 $_SERVER['REQUEST_URI'] 字符串,即使用 explode(),如果文章不存在所选语言,请发送 header("HTTP/1.0 404 Not Found"); 否则显示文章。

      【讨论】:

      • 多语言功能存档在 .htaccess 中。那么,$_SERVER['REQUEST_URI'] 的分析应该在 .htaccess 文件中?
      • 你能举一个那个.htaccess的例子吗?我想在那个 index.php 中会有类似rewrite sitename.com/en/<articlename> to sitename.com/index.php?lang=en 的东西,你可以分析 $_SERVER['REQUEST_URI'] 以找出该文章是否存在......或者如果你直接在重写中获得文章名称,你不'不需要REQUEST_URI,你可以直接查看...
      【解决方案5】:

      如果您使用 CMS 等,因此语言文件夹确实存在,您可以使用:

      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-l
      RewriteRule ^(ie|en|de)/ /404.php/$1 [R=404,L]
      

      说明

      • 三个条件检查请求的文件或文件夹不存在
      • 该规则检查请求的网址是否以三个国家之一开头,然后是 /,将国家代码捕获到第 1 组
      • 它重定向到/404.php?lang=$1,例如/404.php?lang=en 带有 404 代码

      在那个 404.php 中你只需要使用 $_GET['lang'] 来获取请求的语言。


      但您已经说过,多语言功能在 .htaccess 中存档。了解该文件中的内容会很有帮助。

      无论如何:如果所有请求都被重定向到一个页面(例如 index.php),则该文件中的某处将包含该站点的内容。这发生在文件的包含或类似文件或对数据库的查询中。 这就是您需要扩展代码的地方。如果找不到该文件或数据库中没有记录,则需要包含 404 文件。

      【讨论】:

        【解决方案6】:

        请使用 .htaccess 底部的代码。将 Path 替换为您的路径。

        重写规则 ^pagenotfound$ 404.html ErrorDocument 404 路径/pagenotfound

        【讨论】:

          【解决方案7】:

          它不会将您重定向到 404.php 文件,因为您访问了现有文件。看看这个网址

          sitename.com/en/adsdasaerera

          “adsdasaerera”可能只是一个被htaccess重写的参数值。它不是一个文件。我想你有一个“en”文件夹和 index.php。因此,当您在上面输入 url 时,您使用参数“adsdasaerera”访问“en”文件夹中的 index.php,这就是您没有收到 404 错误的原因。您可以通过添加在数据库中搜索“adsdasaerera”的少量代码来解决它,如果它不存在,请在您的代码中手动将其重定向到 404.php 文件。

          你在这个url上得到404.php的原因

          sitename.com/adsdasaerera

          是因为您没有名为“adsdasaerera”的文件。

          希望对你有帮助:)

          【讨论】:

          • 你能给我一个小例子吗,在数据库中搜索相应文件并重定向到 404.php?
          • 好吧,我需要更多关于您的网站如何运作的信息,但我会试一试。因此,如果您在“en”文件夹中确实有 index.php,它从 URL 参数中获取标题,在本例中为“adsdasaerera”,它可能是文章的标题,那么您可以在数据库中搜索该标题.如果找不到,则将其重定向到 404.php。
          • 起初我想知道为什么你被否决了,因为我认为你是对的。但后来你开始讨论 index.phpadsdasaerera 作为参数。尽管您确实很快提到了rewrited by htaccess,但如果您对.htaccess 和/或处理网络请求的方式知之甚少,则非常不清楚发生了什么。
          • 您没有提供足够的信息。如果你有,问题可能现在就解决了。我们只能猜测问题出在哪里。好吧,我创建了一个与您的问题相同的多语言 Web 应用程序,并且运行良好。我每天都在使用 .htaccess,我完全理解如何处理 Web 请求。至少我解决了我遇到的每一个问题。
          【解决方案8】:

          应该可以在htaccess 文件中像这样定义ErrorDocument

          ErrorDocument 404 http://sitename.com/404.php
          

          然后对 404.php 文件中的请求进行特定语言重定向检查。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-11-10
            • 1970-01-01
            • 2015-01-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多