Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 设置多个404页面时避免302重定向_Php_.htaccess_Redirect_Http Status Code 404_Http Status Code 302 - Fatal编程技术网

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

Php 设置多个404页面时避免302重定向,php,.htaccess,redirect,http-status-code-404,http-status-code-302,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

我的错误页面是一个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应该是,状态代码应该是302。这很好用

我希望访问任何其他不存在的URL(在“vwxyz”目录中,或example.com上的任何其他地方)的用户能够看到,但是要返回404状态码,并且他们浏览器中的URL仍然应该是他们错误键入的内容。当然,这对header('Location…)不起作用,我不能使用file\u get\u contents或include,因为结果会清空购物车并注销用户(如果用户已登录)


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

  • URL是否以
    /abcde/
  • URL不是文件吗
  • URL不是目录吗
  • 如果这些都是真的,那么您希望(使用302)路由到
    /vwxyz/abcde error page.php

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


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

    “我觉得有一种更简单的方法可以在不编辑.htaccess文件的情况下拥有多个404页面(尽管可能会有人认为这确实是更简单的方法)。”…是的,我非常确定这将是3行在.htaccess中的代码,它确实工作得很好;似乎真正的问题是,当其他方法通常更适合时,我倾向于尝试在PHP中执行所有操作。