具有动态页面(php)性能的apache.htaccess规则

具有动态页面(php)性能的apache.htaccess规则,php,mysql,performance,.htaccess,Php,Mysql,Performance,.htaccess,我有一个新的网站(我现在正在建设一个),我想确保我做得正确,而不是在一个月后重新设计 所以我有这样的页面: /candy /candy/chocolate /drink /drink/beer 因此,我查看stackoverflow,了解如何做到这一点,我发现: RewriteRule ^([a-z]+)/([a-z]+)/?$ index.php?category=$1&page=$2 [NC,L] 现在,这将起作用,但我的问题是关于执行。显然,$_GET[category]将是名

我有一个新的网站(我现在正在建设一个),我想确保我做得正确,而不是在一个月后重新设计

所以我有这样的页面:

/candy
/candy/chocolate
/drink
/drink/beer
因此,我查看stackoverflow,了解如何做到这一点,我发现:

RewriteRule ^([a-z]+)/([a-z]+)/?$ index.php?category=$1&page=$2 [NC,L]
现在,这将起作用,但我的问题是关于执行。显然,$_GET[category]将是名称,例如,页面将是巧克力

现在,当我进行查询时,我将执行以下操作:

$sql = "SELECT myfields FROM mytable WHERE name = '" . $_GET['category'] . "'";

现在,如果我使用的主键是INT,会更好吗?如果是这样,我可以在.htaccess中做些什么来做到这一点?

URL中使用的标识符应该是唯一的,并且有一个数据库索引。如果ID和category名称都是唯一的,并且都被索引了,那么从性能上讲,它是相同的,但是我建议使用这个名称,因为它比内部ID更友好,更具描述性,当URL显示在没有太多额外上下文的某处时,这一点变得尤为重要(例如,
example.org/1
vs.报纸上印刷的
example.org/shoes
)。如果不是,则使用ID并将重写规则更改为:

RewriteRule ^(\d+)/([a-z]+)/?$ index.php?category=$1&page=$2 [NC,L]

(顺便说一句,
\d+
也应该用于
页面,如果它是数字的话。)

只要确保您的数据库中有一个名称行。这将使查找速度与使用整数主键一样快

我想可以使用类似于在mytable上创建索引名的方法,但通过phpmyadmin进行创建要容易得多

还可以使用addslashes保护脚本不受sql注入的影响

$sql = "SELECT myfields FROM mytable WHERE name = '" . addslashes($_GET['category']) . "'";

不幸的是,使用名称并将其转换为唯一id可能比在名称本身上创建索引花费更长的时间来执行

根据您拥有的URL,以下是我的建议:

在页面名称中添加索引

ALTER TABLE `mytable` ADD key indexname (columnname);
例如:

ALTER TABLE `page` ADD key pagename (name);
现在,由于结构与
/candy
/candy/chocolate
不同,我假设您有某种结构,比如带有列表(/candy)和特定列表(/candychocolate)的主页面,因此在这种情况下,您可以使用:

RewriteRule ^([a-z]+)/?$ index.php?category=$1&page=list [NC,L]
RewriteRule ^([a-z]+)/([a-z]+)/?$ index.php?category=$1&page=$2 [NC,L]
然后,您可以使用索引字段简单地查询类别和页面。这将很快(当然没有INT那么快,但仍然很快)

对于第一个查询,您可以执行以下操作:

$name = addslahes($name);
SELECT fields FROM category WHERE category = '$name';
当您获得一个页面时,您可以使用:

$categoryname = addslahes($categoryname);
$pagename = addslahes($pagename);
SELECT fields FROM page LEFT JOIN category ON (page.categoryid = category.id) WHERE page = '$pagename' AND category = '$categoryname';

这样,通过同时使用类别和页面,您将避免页面未找到(404).

如果名称是唯一的,那就不重要了。如果名称不是唯一的,那你就完蛋了。@bianca:你介意使用像stackoverflow这样的URL吗?/id/category/page?like:/123/candy/chocolate/糖果和巧克力的键是唯一的,123是本例中巧克力id的最后一页?我最好不要,但如果它是唯一的选项的话我想是的。您有权访问
httpd.conf
apache2.conf
?哦,那么不,您没有权访问此apache文件(这些文件是配置文件)。“SELECT…FROM…WHERE name=”$\u GET['category']”这一部分当然比原始问题本身更值得一提!请保护您的代码不受SQL注入的影响,不要只在SQL查询中填充用户输入。您可以通过先从DB中选择所有类别名称,然后检查
$\u是否获取['category']来添加更多保护
是通过类似
array\u key\u exists
@hijarian不知道这比addslashes更安全。这两种方法都无法注入代码,addslashes要短得多。有些人会建议使用mysql\u real\u escape\u字符串,但这只有在使用ISO-8859-1或其他字符集时才重要UTF-8。