.htaccess如果没有匹配则重定向到404

时间:2015-07-30 13:00:50

标签: php apache .htaccess

我尝试了一些线程,但似乎与我需要的东西相符。

我有一些htaccess代码来提供类别页面,如下所示:

RewriteRule ^([^/\.]+)/?$ category.php?s=$1 [L,QSA]

QSA标志位于那里,基本上为页面提供了一些过滤器。 我只有4个类别,所以为了论证,我的类别URL将是:

http://domain.co.uk/category-url-1
http://domain.co.uk/category-url-2
http://domain.co.uk/category-url-3
http://domain.co.uk/category-url-4

我遇到并且无法解决的问题是我需要在htaccess中匹配这些类别,如果它们不存在,则重定向到404页面。类别网址不会改变,所以我可以硬编码。

目前在我的类别页面上,我有PHP代码:

header("HTTP/1.0 404 Not Found");
header("Location: /404.php");

...如果找不到匹配......但从技术上讲,所有这一切都显示为302,因为类别页面存在并且首先处理代码。我已经在线检查过这些标题,然后给出了302。

如果上面的那些类别不匹配,有没有办法在htaccess中对此进行硬编码?

2 个答案:

答案 0 :(得分:5)

因为根据我对你的问题的理解,mod_rewrite将始终转到一个确实存在的页面(category.php),你必须在category.php页面中设置404错误生成,

不要单独设置404错误标题,只需

    if (no match with categories){
     //header("Location:404.php",TRUE, 404);
      header("Location:404.php");
      exit;
    }

据我所知.htaccess它无法读取它正在处理的数据(类别网址)是否有效,因为它无法告诉您该类别是否真实或者假,因为这只能由PHP脚本定义。

抱歉,我错过了标题的Location:部分

更新

我认为你引用的循环是David,当PHP文件重定向到404.php页面时,.htaccess会尝试将其与重写规则相匹配,因此你需要添加检查才能重写URL那些没有引用已经存在的文件或文件夹,在你的.htaccess中:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/\.]+)/?$ category.php?s=$1 [L,QSA] 

如果不指向重写前存在的文件或文件夹,则只会重写URL。

更新编辑2

问题在于,现在OP希望404页面的错误被网站的SEO方面注意为404错误,这不是由header("Location:")完成的,因为它的性质标题位置是重定向。

所以: 在这里阅读:Why won't my PHP app send a 404 error?我认为问题是因为PHP将状态代码设置为404,找不到文件,然后 成为PHP页面负责输出404文件 即可。因此,不应设置标题位置重定向,而应将标题设置为404错误标题,然后在标题之后,可以在category.php页面上输出404错误页面作为类别页面中的包含,

所以,解决方案是,当category.php页面的类别调用无效时,需要输出一个带有404的标题:

header('HTTP/1.0 404 Not Found');

紧跟着输出消息到浏览器的类别页面,其中包括404.php

如:

<?php
if (!category match){
    header('HTTP/1.0 404 Not Found');
    include "404.php";
}

我不知道您的404.php是如何设置的,但您可能需要调整代码以输出包含404.php中的返回值的包含文件, 这应该导致不正确的类别代码显示404错误标题用于SEO目的。

答案 1 :(得分:0)

在PHP中,你应该检查它的类别是url-1,2,3 o 4.你可以通过在PHP文档中创建一个数组来实现这个目的:

<!-- language: lang-php -->
$allowed_categories = array('category-url-1'
                             ,'category-url-2'
                             ,'category-url-3'
                             ,'category-url-4'
                           );

if (!empty($_GET['s']) && in_array($_GET['s'], $allowed_categories))
{
    echo 'Yes! The category exists!';
}
else
{
    header('HTTP/1.0 404 Not Found');
    echo 'The page is not found!';
}

如果要将其重定向到特定的404.php文件,则带有重定向的标头就足够了。您必须确保在404.php文件中指定发送404标头。