我为一个网站创建了一个404.php
页面。此外,还有具有ErrorDocument 404 /404.php
行的.htaccess
文件(在/root 中)。
该网站具有多语言功能,如下所示:
sitename.com/it/article1
sitename.com/en/article1
等等...有很多文章。
当我尝试访问类似sitename.com/adsdasaerera
的内容时,404.php
页面会出现,但当我尝试访问sitename.com/en/adsdasaerera
时,它不会出现,adsdasaerera
显然不是现有文章。
我怎样才能做到这一点?
理想情况下,您将有一个错误 404 文档页面。在该页面上,您将首先设置 en 的默认区域设置,然后确定他们正在使用的用户浏览器区域设置/语言,然后继续执行下一步,即以该语言显示错误页面。
由于我们谈论的是PHP,因此这里有一个如何在PHP中检测语言环境的答案。在 PHP 中检测客户端区域设置的最简单方法
从那里开始,下一步基本上是使用数组或文件中与该区域设置关联的字符串并显示它们。
在此页面上,如果用户不希望以浏览器设置为使用的语言阅读错误,您还可以提供一些指向可以查看的其他翻译的链接(单击时显示div 的隐藏元素)。
你试过给它一个完整的路径吗?
ex ErrorDocument 404 /site/error/404.html
你有没有试过把ErrorDocument 404 /404.php
行放到apache全局配置文件中,也许在/etc/httpd/中。或者 somesite.com/en/文件夹下是否有一个现有的.htaccess文件?
你如何构建多语言功能?用Apache 或 .htaccess 重写? 你的PHP代码是什么?
除了Branimir Đureks的答案之外,您还可以分析$_SERVER['REQUEST_URI']
字符串,即使用explode()
,如果所选语言中不存在文章,则发送header("HTTP/1.0 404 Not Found");
否则显示文章。
如果您没有使用CMS等,那么语言文件夹确实存在,则可以使用以下内容:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(ie|en|de)/ /404.php/$1 [R=404,L]
解释
- 这三个条件检查请求的文件或文件夹是否存在
- 该规则检查请求的 url 是否以三个国家/地区之一开头,然后以/开头,将国家/地区代码捕获到组 1
- 它重定向到
/404.php?lang=$1
,例如 使用 404 代码/404.php?lang=en
在 404 中.php您只需要使用$_GET['lang']
即可获取请求的语言。
但是您已经说过,多语言功能已在.htaccess中存档。了解该文件中的内容会很有帮助。
无论如何:如果所有请求都被重定向到一个页面(例如index.php),则该文件中的某个地方将包含网站的内容。包含或类似文件或数据库查询都会发生这种情况。这就是您需要扩展代码的要点。如果未找到该文件或数据库中没有记录,则需要包含 404 文件。
请使用 .htaccess 底部的此代码。将"路径"替换为您的路径。
重写规则 ^pagenotfound$ 404.html错误文档 404 路径/页面未找到
它不会将您重定向到 404.php 文件,因为您访问了现有文件。查看此网址
sitename.com/en/adsdasaerera
"Adsdasaerera"可能只是一个由 htaccess 重写的参数值。它不是一个文件。我想你有一个"en"文件夹和索引.php里面。因此,当您在上面输入 url 时,您可以在带有参数"adsdasaerera"的"en"文件夹中访问该索引.php这就是您没有收到 404 错误的原因。您可以通过添加少量代码来解决此问题,这些代码在数据库中搜索"adsdasaerera",如果不存在,则在您的代码中手动将其重定向到 404.php 文件。
您在此网址上获得 404.php
的原因sitename.com/adsdasaerera
是因为您没有名为"adsdasaerera"的文件。
希望它能帮助你:)
可以在htaccess
文件中定义这样的ErrorDocument
:
ErrorDocument 404 http://sitename.com/404.php
然后对文件中的请求执行特定于语言404.php
重定向检查。