PHP 和 htaccess |如果用户尝试直接访问 url 中的参数值,则重定向到 "page not found"

PHP and htaccess | Redirect to "page not found" if user try to directly access parameter value inside url

我在我的网站上使用了这个友好的 url:

https://myexample.com/post/10/post-title

我正在尝试做一些拒绝用户直接访问参数值的事情。例如,如果用户尝试在上面的 url 中添加另一个 id,htaccess 会将他重定向到 404 页面。

下面是我的 htaccess 代码,它将我的 url get 参数转换为友好的 url 并且非常有效:

RewriteEngine On
RewriteRule ^post/([^/]*)/([^/]*)$ /news?id=&title= [L]

在这种情况下,我该如何改进我的 htaccess 才能做到这一点?

感谢任何帮助。

我找到了解决问题的方法并且工作正常:

我的.htaccess:

RewriteEngine On
RewriteRule ^post/?(.*)/([^/]*)$ /news?id=&title= [L]

首先,我在 news.php:

title 参数上实现了一个替换空格和特殊字符的功能
function sanitizeString($str) {
    $str = preg_replace('/[áàãâä]/ui', 'a', $str);
    $str = preg_replace('/[éèêë]/ui', 'e', $str);
    $str = preg_replace('/[íìîï]/ui', 'i', $str);
    $str = preg_replace('/[óòõôö]/ui', 'o', $str);
    $str = preg_replace('/[úùûü]/ui', 'u', $str);
    $str = preg_replace('/[ç]/ui', 'c', $str);
    $str = preg_replace('/[^a-z0-9]/i', '-', $str);
    $str = preg_replace('/_+/', '-', $str);
    return $str;
}

然后我在 news.php 上创建了一个脚本,用于检查 idtitle 参数是否正确关联 MySql:

include 'connection.php';

$stmt = $db -> prepare('SELECT id, title FROM posts WHERE id = ?');

$id = $_GET['id'];

$stmt -> bind_param('i', $id);
$stmt -> execute();
$stmt -> store_result();
$stmt -> bind_result($postID, $title);
$stmt -> fetch();
$stmt -> close();
$db -> close();

$postTitle = sanitizeString(trim(strtolower($title)));

if($_GET['id'] != $postID || $_GET['title'] != $postTitle){
    
    header('location: /404.html');
    exit();
    
}else{
    
    echo 'Everything Fine';
    
}

基本上,根据上面的代码,如果用户尝试在 URL 中操作参数,例如 id /10/ 和 title /post-title:

https://myexample.com/post/10/post-title

例如,脚本会将用户重定向到 404 错误页面或页面未找到或某些自定义页面。

如果有人有更好的改进方法,请在这里告诉。

希望这个问题可以帮助到其他人。