Правило apache .htaccess с производительностью динамических страниц (php) - PullRequest
8 голосов
/ 08 февраля 2012

У меня есть новый веб-сайт (я сейчас его создаю), и я хочу убедиться, что я делаю это правильно и не перепроектирую через 1 месяц.

так что у меня есть такие страницы:

/candy
/candy/chocolate
/drink
/drink/beer

, поэтому я смотрю на stackoverflow о том, как я могу это сделать, и я нашел:

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

сейчас, это будет работать, но мой вопрос касается исполнения. очевидно, $ _GET [категория] будет именем, а страница будет шоколадной, например.

Теперь, когда я сделаю запрос, я сделаю:

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

Теперь, было бы лучше, если бы я использовал первичный ключ, который является INT. если так, что я могу сделать в моем .htaccess, чтобы сделать это?

Ответы [ 3 ]

7 голосов
/ 10 февраля 2012

К сожалению, использование имени и преобразование его в уникальный идентификатор может занять больше времени, чем создание индекса для самого имени.

Вот что я рекомендую, исходя из ваших 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).

3 голосов
/ 08 февраля 2012

Просто убедитесь, что в вашей базе данных есть индекс для строки имени. Это сделает поиск таким же быстрым, как использование целочисленного первичного ключа.

Используйте что-то вроде CREATE INDEX name ON mytable Я думаю, но сделать это через phpmyadmin намного проще.

Также защитите скрипт от SQL-инъекций, используя дополнительные черты

$sql = "SELECT myfields FROM mytable WHERE name = '" . addslashes($_GET['category']) . "'";
0 голосов
/ 08 февраля 2012

Идентификатор, используемый в URL, должен быть уникальным и иметь индекс базы данных. Если идентификатор и имя категории уникальны и проиндексированы, то с точки зрения производительности они одинаковы, но я бы порекомендовал использовать это имя, поскольку оно более дружественно для поисковых систем и имеет описательный характер, чем внутренний идентификатор, что особенно важно, когда URL-адрес отображается где-то без особого дополнительного контекста (например, example.org/1 против example.org/shoes, напечатанного в газете). Если нет, то используйте ID и измените правило перезаписи на:

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

(Кстати, \d+ также следует использовать для page, если оно числовое.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...