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

Avoiding 302 redirect when setting up multiple 404 pages

我的错误页面是一个 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。这工作正常。

我希望转到任何其他不存在的 URL(在 "vwxyz" 目录中,或 example.com 上的其他任何地方)的用户 see https://example.com/vwxyz/error-404-page.php,但对于 404 状态代码进行 returned,他们浏览器中的 URL 应该仍然是他们错误输入的任何内容。当然,这不是使用 header('Location ... 我不能使用 file_get_contents 或 include 因为结果会清空购物车并注销用户(如果他们已登录)。

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

如果我正确理解问题, 通过根 .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. URL 是否以 /abcde/
  2. 开头
  3. URL 不是文件
  4. 是URL不是目录

如果这些都是真的,那么您想路​​由(使用 302)到 /vwxyz/abcde-error-page.php

对于任何真正的 404 错误,您可以使用默认的 ErrorDocument 404 ... 语法。

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