我尝试了一些线程,但似乎与我需要的东西相符。
我有一些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中对此进行硬编码?
答案 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。
问题在于,现在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标头。