.htaccess规则不起作用

时间:2016-02-29 01:54:33

标签: php .htaccess

PHP:

$category = $_GET["category"];
$result = "SELECT * FROM my".$category." ORDER BY id_".$category.";

htaccess的:

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

返回:

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

2是数字页面,但我希望类别不是数字。

我不知道我哪里出错了

2 个答案:

答案 0 :(得分:2)

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

    RewriteRule ^category_([^_]+)/?$ site/category.php?category=$1 [NC,L]
RewriteRule ^category_(.*)_(.*)/?$ site/category.php?category=$1&page=$2 [NC,L]

答案 1 :(得分:2)

您使用.*和可选/的第一条规则不够严格,并且两个网址都匹配。

此更新的规则应允许您期望的网址。 []是一个字符类,如果有更多字符需要允许在那里添加它们。 {}是范围,第一个数字是最小值,第二个是最大值。

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]

测试正则表达式的好地方是regex101。它显示了正则表达式匹配的内容并解释了它的每个部分。

原始示例:https://regex101.com/r/zO7lI8/1
新示例:https://regex101.com/r/zO7lI8/2

这应解决您的.htaccess问题。

请注意,对于regex101,分隔符为/,因此需要对所有/进行转义,具体取决于使用正则表达式的语言/软件,可能不需要分隔符。除非是分隔符,否则/不是特殊字符。所以它不需要被转义。

此:

$category = $_GET["category"];
$result = "SELECT * FROM my".$category." ORDER BY id_".$category.";

虽然仍然对sql注入开放。用户可以在$_GET["category"]中输入任何内容并从数据库中获取内容。恶意用户甚至可能会提取所有用户名,密码和电子邮件。

看看:

How can I prevent SQL injection in PHP?
http://php.net/manual/en/security.database.sql-injection.php
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

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