我必须使用自定义404页面进行网址重定向(.htaccess不是一个选项)。我正在考虑使用下面的代码。我正在尝试通过向URL添加标志来解释有效的重定向,以及未找到页面的真实情况。你觉得怎么样?
<?php
// check GET for the flag - if set we've been here before so do not redirect
if (!isset($_GET['rd'])){
// send a 200 status message
header($_SERVER['SERVER_PROTOCOL'] . ' 200 Ok');
// redirect
$url = 'new-url/based-on/some-logic.php' . '?rd=1';
header('Location: ' . $url);
exit;
}
// no redirection - display the 'not found' page...
?>
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>404:</h1>
<h3>Sorry, the page you have requested has not been found.</h3>
</body>
</html>
编辑 - .htaccess不是一个选项的原因是因为我在没有apache的IIS6上运行。
答案 0 :(得分:4)
添加404 header代:
...
header("HTTP/1.0 404 Not Found");
// for FastCGI: header("Status: 404 Not Found");
// no redirection - display the 'not found' page...
?>
...
删除200个代码:
// delete this line
header($_SERVER['SERVER_PROTOCOL'] . ' 200 Ok');
// because code should be 302 for redirect
// and this code will be generated with "Location" header.
答案 1 :(得分:0)
如果我没有弄错你,你想要为404页面显示一个页面,也就是说,不再存在的页面。
据我所知(可能不是太多)你不能只将php页面设置为没有.htaccess或apache conf文件的404处理程序。
我记得404.shtml是普通apache设置中404处理程序的默认文件,因此您需要将代码放在该页面中,
因为你不能使用.htaccess并且页面是SHTML,你不能把php放在那里,你从404.shtml到你的404.php的Javascript重定向可能会有所作为,
希望有所帮助。
答案 2 :(得分:0)
看起来您不想重定向,但要包含相关页面。重定向不是必需的。事实上,它会破坏使用apache 404错误处理程序的好网址。
以下示例脚本首先将请求解析为(相对)文件名即模块。在您的代码中new-url/based-on/some-logic.php
或类似。
接下来,如果找不到模块,将使用错误页面模板。我已将其命名为error404.php
,因此您还需要创建该文件。
作为最后的手段,即使找不到错误模板,也会返回标准的404错误消息。
<?php
// === resolver ===
// put your logic in here to resolve the PHP file,
// return false if there is no module for the request (404).
function resolveModule() {
// return false;
return 'new-url/based-on/some-logic.php';
}
// returns the filename of a module
// or false if things failed.
function resolveFile($module) {
$status = 200;
if (false === $module) {
$status = 404;
$module = 'error404.php';
}
// modules are files relative to current directory
$path = realpath($module);
if (!file_exists($path)) {
// hard 404 error.
$status = 404;
$path = false;
}
return array($path, $status);
}
// process the input request and resolve it
// to a file to load.
$module = resolveModule();
list($path, $status) = resolveFile($module);
// === loader ===
// send status message
header($_SERVER['SERVER_PROTOCOL'] . ' ' . $status, true, $status);
if (false !== $path) {
include($path); // include module file (instead of redirect)
} else {
// hard 404 error, e.g. the error page is not even found (misconfiguration)
?>
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>404:</h1>
<h3>Sorry, the page you have requested has not been found.</h3>
<p>Additionally the good looking error page is not available, so it looks really sad.</p>
</body>
</html>
<?
}