Php htaccess:2个不同的404错误文件(或内容)

Php htaccess:2个不同的404错误文件(或内容),php,.htaccess,url,Php,.htaccess,Url,我正在使用.htaccess文件捕获错误文档。现在,我有: ErrorDocument 404 /errors/error404.php 它工作得很好,但是现在,我想要另一个错误404文件(或者这个文件的另一个内容),如果前面的url包含“eu” ErrorDocument 404/errors/error404.php ErrorDocument 404/errors/eu_error404.php 这可能吗?或者,我可以捕捉到我用来使用PHP执行不同include的URL吗 我希望避免$

我正在使用.htaccess文件捕获错误文档。现在,我有:

ErrorDocument 404 /errors/error404.php
它工作得很好,但是现在,我想要另一个错误404文件(或者这个文件的另一个内容),如果前面的url包含“eu”

ErrorDocument 404/errors/error404.php
ErrorDocument 404/errors/eu_error404.php
这可能吗?或者,我可以捕捉到我用来使用PHP执行不同include的URL吗

我希望避免
$\u会话

我看到了这样的情况:
$\u SERVER['HTTP\u REFERER']


有人能解释一下吗:)?

除非您可以访问服务器配置(或使用Apache 2.4+),否则测试错误文档文件中的URL并在PHP中生成适当的内容可能会更容易

但是,您应该检查
$\u服务器['REQUEST\u URI']
$\u服务器['REDIRECT\u URL']
(不包括查询字符串,如果有的话)。注意
\u URI
\u URL
之间的区别。另外请注意,
$\u SERVER['REDIRECT\u URL']
仅在错误文档中有效

$\u服务器['HTTP\u REFERER']
包含HTTP
REFERER
头的值(如果有)。即,发出请求的URL。这有时是空的,对于直接请求,它确实是空的

在URL中的任何地方简单地测试“eu”似乎有点太笼统了?(URL是否如您的评论所暗示的那样以
/eu/
开头?)

例如:

<?php
$htm = '';

// strstr() is case-sensitive
$isEu = strstr($_SERVER['REDIRECT_URL'],'eu');
if ($isEu) {
    $htm .= 'EU Error document....';
} else {
    $htm .= 'Error document for everyone else...';
}
echo $htm;

在我看来,使用referer没有多大意义,因为404错误页面是指某人试图访问的URL,但无论如何都不存在。您可以做的是:像往常一样设置默认错误文档

ErrorDocument 404 /errors/error404.php
现在检查请求的URL是否以“eu”开头(如果对您有意义,您也可以使用
%{HTTP\u REFERER}
),如果是,请使用不同的错误文档

<If "'%{REQUEST_URI}' =~ m#^/?eu#">
   ErrorDocument 404 /errors/eu_error404.php
</If>

ErrorDocument 404/errors/eu_error404.php
因此,对于
example.com/page,不要退出默认的404页面,但是对于不存在的
example.com/eu页面,我们得到了eu 404版本

为此,您需要apache 2.4

在PHP中做一些事情是没有必要的,但是如果您愿意,当然可以这样做


只需检查
$\u服务器['REQUEST\u URI']
$\u服务器['REDIRECT\u URL']
变量

保存代码并尝试以下代码:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (eu)+
#the line above will catch any request contains eu
RewriteRule ^(.*)$ /errors/eu_error404.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(eu)+
#the line above will exclude any request contains eu
RewriteRule ^(.*)$ /errors/error404.php
更新

如果您只想要以eu开头的请求,请按以下方式更改代码:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/eu
#the line above will catch any request starts with eu
RewriteRule ^(.*)$ /errors/eu_error404.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/eu
#the line above will exclude any request starts with eu
RewriteRule ^(.*)$ /errors/error404.php

关于你的问题,影响搜索引擎优化的不是搜索引擎优化问题,而是用户体验问题,例如,如果你有旧页面,用户仍在请求,你将他们重定向到不相关的页面,这会给他们带来不好的结果,所以最好用替代页面来处理,关于搜索引擎,当404来自任何请求时,它将被保留,然后在多次请求后被删除,但更多的404在某些情况下并不好,因此,这取决于您预期的错误页面,他们以前是否已经被索引过,最好将他们重定向到相关页面,或者只是错误的请求,您希望引导用户选择正确的方式,但相信错误的请求在正常实践中不会超过正确的程度,因此将他们重定向到解释错误的页面并引导他们更正页面等都不是问题

查看答案。使用%{HTTP\u REFERER}代替%{ENV:device:.iphone}。这似乎是我想要的,谢谢!但是,在我的404错误文件中,当我这样做时:
echo$\u SERVER['HTTP\u REFERER']
,它什么也不回显。我做错了什么?在myurl.fr/eu/上,转到-->myurl.fr/eu/blabla(404页)它可以工作,谢谢!经过投票,我将尝试不使用PHP的解决方案,如果结果不太好,它将是我的解决方案:)我在编写
ErrorDocument 404/errors/eu_error404.PHP
时遇到内部服务器错误500。我如何解决这个问题?您有什么Apache版本?你能访问日志文件并提供消息吗?我有Apache2.0。它说,
W:/var/www/hor/.htaccess:Invalid命令“我在本地主机上,如果可以的话,我明天可能会更新真正的虚拟机,如果不用PHP就可以做到这一点会更好。”。谢谢你的回答,我也投了赞成票!我在Ubuntu 16.04.03 LTS和Apache2.4.27上测试了这一点,如果这有帮助的话。好的,非常完美,只需拷贝和过去就可以了!这是我的解决方案,不需要更新我的虚拟机!谢谢你!很高兴为您提供帮助,祝您一切顺利对不起,此代码有一个大问题。。。。是的,您将看到错误页面,但服务器未发送404状态代码。。。所以对于Google和Co.来说,所有实际上不存在的页面看起来都是普通页面。我不确定这是否应该/必须与某种CMS或PHP框架一起工作,但如果是这样,那么所有URL(包括“eu”一词)都将重定向到404页面。这里有一个你不允许在你的URL中使用的英文单词列表,这取决于返回404代码的页面是否为高权限页面,以及根据网站状态的诸多因素,如果错误页面数量很大或没有,等等
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/eu
#the line above will catch any request starts with eu
RewriteRule ^(.*)$ /errors/eu_error404.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/eu
#the line above will exclude any request starts with eu
RewriteRule ^(.*)$ /errors/error404.php