设置多个404页面时避免302重定向

时间:2016-10-11 15:39:02

标签: php .htaccess redirect http-status-code-404 http-status-code-302

我的错误页面是一个PHP文件,其全部是

<?php
$path_parts = pathinfo($_SERVER['REQUEST_URI']);
$parts = explode('/', $path_parts['dirname']);
if (in_array("abcde", $parts))
{
    header('Location: https://example.com/vwxyz/abcde-error-page.php');
    exit();
}
else
{
    header('Location: https://example.com/vwxyz/error-404-page.php');    
    exit();
}
?>

我希望访问“abcde”目录中不存在的URL的用户看到特定的错误页面,URL应为https://example.com/vwxyz/abcde-error-page.php,状态代码应为302.这样工作正常

我希望转到任何其他不存在的网址(在“vwxyz”目录或example.com上的任何其他位置)的用户看到 https://example.com/vwxyz/error-404-page.php,但是对于404要返回的状态代码,浏览器中的URL应该仍然是他们错误输入的内容。当然,这不适用于标题('位置...我不能使用file_get_contents或包含因为结果清空购物车并注销用户(如果他们已登录)。

我觉得有一种更简单的方法可以拥有多个404页面,而无需编辑.htaccess文件(虽然可能会提到这个参数确实是更简单的方法)。并且至关重要的是,主错误页面的行为与普通错误页面完全相同,但另一个(对于“abcde”目录)是重定向,并且“abcde”目录的特殊错误页面不在该目录中(用户被重定向到目录之外,然后显示“错误”页面,该页面不应返回404状态。)

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,那么通过根.htaccess文件 非常简单。

# enable mod_rewrite and route the request
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} ^/abcde/?.*$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /vwxyz/abcde-error-page.php [R=302,L]

# sets a custom 404 page
ErrorDocument 404 /vwxyz/error-404-page.php

首先,您需要打开重写引擎,然后执行3次检查:

  1. 网址是否以/abcde/
  2. 开头
  3. 网址是文件
  4. 网址不是目录
  5. 如果这些都是真的那么你想要(用302)路由到/vwxyz/abcde-error-page.php

    对于任何正版404错误,您只需使用默认的ErrorDocument 404 ...语法即可。

    (好的,这是.htaccess中的6行 - 比我想的复杂两倍)