我有以下文件。这样做的目的是重定向到正确的新闻。例如: 本地主机/ tostadotv / ESTO-ES-UNA-noticia-28.html
如果我故意修改网址,例如: 本地主机/ tostadotv / ESTO-ES-UNA-noticia-修订于-incorrecta-28.html
我应该将自己重定向到正确的新闻: 本地主机/ tostadotv / ESTO-ES-UNA-noticia-28.html
这个错误在哪里?你能帮我谢谢吗请原谅我的英语我来自阿根廷我不会说英语
的.htaccess
RewriteEngine On
RewriteRule ^.*-([0-9]+)\.html$ noticia.php?id_not=$1 [L]
noticia.php
<?php require_once("lib/connection.php"); ?>
<?php require_once("lib/functions.php"); ?>
<?php
fix_category_product_url();
?>
的functions.php
function fix_category_product_url() {
$proper_url = get_proper_category_product_url(1);
if ( SITE_DOMAIN.$_SERVER['REQUEST_URI'] != $proper_url) {
header('HTTP/1.1 301 Moved Permanently');
header('Location: '.$proper_url);
exit();
}
}
function get_proper_category_product_url($id) {
$product_id = $_GET['id_not'];
$query = sprintf('SELECT titulo FROM noticias WHERE id_not = "%d"', mysqli_real_escape_string($GLOBALS['DB'], $product_id));
$restit = mysqli_query($GLOBALS['DB'], $query);
$noticia = mysqli_fetch_array($restit);
$proper_url = make_category_product_url($noticia['titulo'], $product_id, $id);
return $proper_url;
}
define('SITE_DOMAIN', 'localhost');
function _prepare_url_text($string) {
$NOT_acceptable_characters_regex = '#[^-a-zA-Z0-9_ ]#';
$string = iconv('UTF-8','ASCII//TRANSLIT',$string);
$string = preg_replace($NOT_acceptable_characters_regex, '', $string);
$string = trim($string);
$string = preg_replace('#[-_ ]+#', '-', $string);
return $string;
}
function make_category_product_url($product_name, $product_id, $ido) {
$clean_product_name = _prepare_url_text($product_name);
if ($ido == 0)
$url = strtolower($clean_product_name).'-'.$product_id.'.html';
else
$url = SITE_DOMAIN.'/tostadotv/'.strtolower($clean_product_name).'-'.$product_id.'.html';
return $url;
}
答案 0 :(得分:0)
如评论中所述,提问者的最终解决方案是将http://
添加到已定义的SITE_DOMAIN
常量。
<强>之前强>
define('SITE_DOMAIN', 'localhost');
<强>后强>
define('SITE_DOMAIN', 'http://localhost');
但除此之外还有更多内容。让我们关注以下两个功能:
function fix_category_product_url(){
$proper_url = get_proper_category_product_url(1);
if(SITE_DOMAIN.$_SERVER['REQUEST_URI'] != $proper_url){
header('HTTP/1.1 301 Moved Permanently');
header('Location: '.$proper_url);
exit();
}
}
function make_category_product_url($product_name, $product_id, $ido) {
$clean_product_name = _prepare_url_text($product_name);
if($ido == 0)
$url = strtolower($clean_product_name).'-'.$product_id.'.html';
else
$url = SITE_DOMAIN.'/tostadotv/'.strtolower($clean_product_name).'-'.$product_id.'.html';
return $url;
}
这里的想法是$proper_url
实际上最终会从make_category_product_url()
获取值,因为get_proper_category_product_url()
会返回结果。这是有道理的,因为make_category_product_url()
有更多的参数,并使用另一个来获取它们的值。
有趣的是,第二个函数的else
块并不总是返回路径,而是返回URL。这里的问题是这样的URL是在没有定义协议的情况下给出的,而是从域名开始。因此,该值被误认为是路径。
现在看看第一个函数:它最终使用header('Location: '.$proper_url);
重定向用户。正如我们之前讨论的那样,$proper_url
并不总是路径,因此每当发生URL而不是路径时,都应该在代码中的某处添加协议。这就是实际解决方案的用武之地:添加http://
定义SITE_DOMAIN
是实现此目的的一种方法,因为此常量仅在URL发生时使用。 还有很多其他方法可以做到这一点,但这个方法完全有效。