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

时间:2017-10-02 14:27:58

标签: php .htaccess url

我正在使用.htaccess文件来捕获ErrorDocument。现在,我有:

ErrorDocument 404 /errors/error404.php

效果很好,但现在,我想要另一个错误404文件(或此文件的其他内容),如果前一个网址包含" eu"。

ErrorDocument 404 /errors/error404.php
<!-- If URL contains "eu", do : -->
ErrorDocument 404 /errors/eu_error404.php

这可能吗?或者我可以抓住我执行不同的URL包含PHP吗?

我想避免$_SESSION ..
我看到了类似的事情:$_SERVER['HTTP_REFERER']

有人能解释我:)?

3 个答案:

答案 0 :(得分:2)

在我看来,使用referer剂量并没有多大意义,因为404错误页面是指某人试图达到的URL,但由于某种原因而不存在。您可以做的是流动:像往常一样设置默认的错误文档

ErrorDocument 404 /errors/error404.php

现在检查所请求的网址(如果这个集会对你有意义,你也可以使用%{HTTP_REFERER})以&#39; eu&#39;开头。如果是这样,请使用不同的错误文档

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

因此example.com/page-do-not-exit =&gt;默认404页面,但适用于example.com/eu-page-that-do-not-exist =&gt;我们得到了eu 404版本。

你需要apache 2.4! https://httpd.apache.org/docs/2.4/de/mod/core.html#if

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

只需检查您的$_SERVER['REQUEST_URI']$_SERVER['REDIRECT_URL']变量

即可

答案 1 :(得分:1)

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

但是,您应该检查$_SERVER['REQUEST_URI']$_SERVER['REDIRECT_URL'](排除查询字符串,如果有的话)。请注意_URI_URL之间的差异。另请注意,$_SERVER['REDIRECT_URL']仅适用于错误文档。

$_SERVER['HTTP_REFERER']包含HTTP Referer标头的值(如果有)。即。发出请求的URL。这有时是空的,对于直接请求,它确实是空的。

在URL中的任何地方测试“eu”似乎有点过于笼统? (根据您的评论暗示,网址是以 /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;

答案 2 :(得分:0)

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

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在某些情况下不好所以,这取决于你预期的错误页面,他们已经索引之前,最好将它们重定向到相关页面或只是错误的请求,你想引导用户正确的方式,但相信错误的请求在正常的练习中不会是正确的,所以将它们重定向到解释的页面不是问题他们的错误并指导他们纠正页面等。