设置多个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 项检查:
- URL 是否以
/abcde/
开头
- URL 不是文件
- 是URL不是目录
如果这些都是真的,那么您想路由(使用 302)到 /vwxyz/abcde-error-page.php
对于任何真正的 404 错误,您可以使用默认的 ErrorDocument 404 ...
语法。
(好的,这是 .htaccess 中的 6 行 - 是我猜想的两倍)
我的错误页面是一个 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 项检查:
- URL 是否以
/abcde/
开头
- URL 不是文件
- 是URL不是目录
如果这些都是真的,那么您想路由(使用 302)到 /vwxyz/abcde-error-page.php
对于任何真正的 404 错误,您可以使用默认的 ErrorDocument 404 ...
语法。
(好的,这是 .htaccess 中的 6 行 - 是我猜想的两倍)