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 上创建了一个脚本,用于检查 id 和 title 参数是否正确关联 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 错误页面或页面未找到或某些自定义页面。
如果有人有更好的改进方法,请在这里告诉。
希望这个问题可以帮助到其他人。
我在我的网站上使用了这个友好的 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 上创建了一个脚本,用于检查 id 和 title 参数是否正确关联 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 错误页面或页面未找到或某些自定义页面。
如果有人有更好的改进方法,请在这里告诉。
希望这个问题可以帮助到其他人。