基于.htaccess和网址国别标识的多语言自定义404页面重定向问题
多语言404页面重定向解决方案
嘿,我来帮你搞定这个根据原URL语言标识跳转对应404页面的问题!你已经完成了基础的ErrorDocument配置,接下来咱们分两种方案实现需求,同时解决你之前遇到的stristr无效和.htaccess不工作的问题。
方案一:直接在.htaccess中处理(服务器层面,无需PHP)
这个方案更高效,不用经过PHP解析,直接通过Apache的mod_rewrite规则匹配原URL的语言标识,跳转到对应页面。
首先确保你的Apache开启了mod_rewrite模块,然后在.htaccess中添加以下规则:
RewriteEngine On # 处理法语404:匹配包含_fr/的无效请求 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} _fr/ RewriteRule ^ /page404_fr.php [L,R=404] # 处理英语404:匹配包含_en/的无效请求 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} _en/ RewriteRule ^ /page404_en.php [L,R=404] # 默认404页面(未匹配到语言标识时) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ /page404.php [L,R=404]
规则说明:
RewriteCond %{REQUEST_FILENAME} !-f和!-d:确保请求的文件或目录确实不存在(触发404的前提)RewriteCond %{REQUEST_URI} _fr/:匹配原URL中包含_fr/的请求[L,R=404]:L表示这是最后一条规则,R=404表示返回404状态码(关键,避免搜索引擎误判为有效页面)
方案二:在page404.php中用PHP处理(解决你stristr无效的问题)
如果你更倾向于用PHP控制,问题大概率出在你没有获取到正确的原请求URL。Apache在跳转至ErrorDocument页面时,会把原请求的URL存在$_SERVER['REDIRECT_URL']变量中,而不是你可能误用的$_SERVER['PHP_SELF'](后者是当前页面的路径)。
试试这段PHP代码:
<?php // 获取原请求的URL,优先用REDIRECT_URL,兼容不同环境 $originalUrl = $_SERVER['REDIRECT_URL'] ?? $_SERVER['REQUEST_URI']; // 判断语言标识并跳转 if (stristr($originalUrl, '_fr/')) { // 发送404状态码,然后加载法语404内容 http_response_code(404); include '/page404_fr.php'; // 也可以用header跳转:header("Location: /page404_fr.php", true, 404); exit; } elseif (stristr($originalUrl, '_en/')) { http_response_code(404); include '/page404_en.php'; exit; } else { // 默认404内容 http_response_code(404); echo "<h1>404 - Page Not Found</h1>"; } ?>
为什么之前stristr没生效?
很大可能是你用错了变量!比如用$_SERVER['PHP_SELF']得到的是/page404.php,自然匹配不到_fr/或_en/,换成$_SERVER['REDIRECT_URL']就能拿到用户原本访问的错误URL了。
排查.htaccess不工作的常见问题
- 确认mod_rewrite已开启:在Apache的配置文件(httpd.conf或apache2.conf)中,确保
LoadModule rewrite_module modules/mod_rewrite.so这一行没有被注释。 - AllowOverride权限:在你的网站虚拟主机配置中,设置
AllowOverride All(默认可能是None,导致.htaccess规则不生效):<Directory "/path/to/your/website"> AllowOverride All Require all granted </Directory> - 路径正确性:确保
page404_fr.php、page404_en.php的路径和.htaccess/PHP代码中写的一致(比如都在网站根目录)。
内容的提问来源于stack exchange,提问作者Killian M.
相关产品推荐
相关产品推荐

