【问题标题】:Avoiding 302 redirect when setting up multiple 404 pages设置多个 404 页面时避免 302 重定向
【发布时间】:2017-02-20 05:29:44
【问题描述】:

我的错误页面是一个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 上的任何其他位置)的用户查看https://example.com/vwxyz/error-404-page.php,但状态码为 404要返回,并且他们浏览器中的 URL 仍然应该是他们错误输入的任何内容。当然,这不适用于 header('Location ... 而且我不能使用 file_get_contents 或 include 因为结果会清空购物购物车并注销用户(如果他们已登录)。

我觉得有一种更简单的方法可以在不编辑 .htaccess 文件的情况下拥有多个 404 页面(尽管人们可能会认为这确实是更简单的方法)。重要的是主错误页面的行为与正常错误页面完全相同,但另一个(对于“abcde”目录)是重定向,并且“abcde”目录的特殊错误页面不在该目录中(用户被重定向出目录,然后显示“错误”页面,不应返回 404 状态)。

【问题讨论】:

  • “我觉得有一种更简单的方法可以在不编辑 .htaccess 文件的情况下拥有多个 404 页面(尽管可能有人认为这确实是更简单的方法)。” ...是的,我很确定这将是 .htaccess 中的 3 行

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


【解决方案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. URL 是否以/abcde/ 开头
  2. URL 不是文件吗
  3. URL 不是目录吗

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

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

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

【讨论】:

  • 效果很好;似乎真正的问题是,当其他方法更适合时,我倾向于尝试用 PHP 做所有事情。
猜你喜欢
  • 2021-11-18
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 2019-11-06
  • 2019-08-18
  • 2011-06-29
  • 2014-12-02
相关资源
最近更新 更多