Php .htaccess规则不起作用

Php .htaccess规则不起作用,php,.htaccess,Php,.htaccess,PHP: htaccess: $category = $_GET["category"]; $result = "SELECT * FROM my".$category." ORDER BY id_".$category."; 如果我在url浏览器中插入: RewriteRule ^category_(.*)\/?$ site/category.php?category=$1 [NC,L] RewriteRule ^category_(.*)_(.*)\/?$ site/category.ph

PHP:

htaccess:

$category = $_GET["category"];
$result = "SELECT * FROM my".$category." ORDER BY id_".$category.";
如果我在url浏览器中插入:

RewriteRule ^category_(.*)\/?$ site/category.php?category=$1 [NC,L]
RewriteRule ^category_(.*)_(.*)\/?$ site/category.php?category=$1&page=$2 [NC,L]
它起作用了

但如果我插入:

 site.com/category_namecategory
返回:

site.com/category_namecategory_numberpage
2是数字页,但我想要的是类别而不是数字


我不知道哪里出了问题

您的第一条规则与两个请求都匹配,您可以通过在第一个重写模式中添加一个否定字符类来修复此问题

Error: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'myDB.my_2' doesn't exist

您的第一条规则是
*
和可选的
/
,这两个URL都匹配,不够严格

此更新的规则应允许您期望的URL。如果需要允许添加更多字符,则
[]
是一个字符类。
{}
是一个范围,第一个数字最小,第二个数字最大

    RewriteRule ^category_([^_]+)/?$ site/category.php?category=$1 [NC,L]
RewriteRule ^category_(.*)_(.*)/?$ site/category.php?category=$1&page=$2 [NC,L]
测试regex的一个好地方是regex101。它显示了正则表达式匹配的内容,并解释了其中的每个部分

原始示例:
新例子:

这将解决您的
.htaccess
问题

注意:在regex101上,分隔符是
/
,因此所有
/
都需要转义,这取决于使用regex的语言/软件,可能不需要分隔符。
/
不是特殊字符,除非它是分隔符。所以它不需要逃逸

这:

但是仍然可以进行sql注入。用户可以在
$\u GET[“category”]
中输入任何内容,并从数据库中获取内容。恶意用户甚至可能提取所有用户名、密码和电子邮件

看看:




有关SQL注入以及如何防止SQL注入的更多信息。

Thank's@chris85我如何只接受4到20个字母?Thank@chris85,如果您想创建答案,我选择作为已解决感谢您@starkeen您的逻辑正常。这也行得通,但我遵循了chris85的建议,以避免sql注入,这样就不会做出任何错误的假设;SQL注入的危险在于:
$result=“从我的“$category.”中选择*。按id排序“$category”。";。再次感谢@chris85我数据库中表的真实名称类似于
Mytablename\u secondname\u thirdname
我只将表名的一部分放入变量中。这仍然是一个问题?您应该创建一个可以传入的术语白名单(数组),并检查提供的值是否至少在该数组中。否则,用户可以对您的数据库做任何他们想做的事情。我正在使用PDO示例来表示表
$stmt->bindparam(“:title”,“$titless”)的值$stmt->bindparam(“:content”,$contentss)这不再免除创建白名单数组?您不能绑定表/列。这里是白名单方法的大致概念。但是首先是.htaccess,我根据您的提示输入了字母
[a-zA-Z]{4,20}
,任何输入字符的内容都指向notfound.html。所以我无法想象SQL注入攻击url怎么可能
RewriteRule ^category_([a-zA-Z]{4,20})/?$ site/category.php?category=$1 [NC,L]
RewriteRule ^category_(.*)_(.*)/?$ site/category.php?category=$1&page=$2 [NC,L]
$category = $_GET["category"];
$result = "SELECT * FROM my".$category." ORDER BY id_".$category.";