URL без идентификатора
Я часто вижу (переписанные) URL без идентификатора, как в некоторых установках WordPress. Каков наилучший способ достичь этого? Пример: site.com/product/some-product-name/ Может быть, сохранить массив имен страниц и идентификаторов в кэше, чтобы избежать запросов БД на каждый запрос страницы? Как избежать конфликтов и каковы другие проблемы при использовании URL-адресов без идентификаторов?
4 ответа
Использование идентификатора представляет собой одну и ту же головоломку - вы просто проверяете другое значение в своей базе данных. Часть "some-product-name" вашего URL выше также является чем-то уникальным. Некоторые люди называют их слизнями (Wordpress, также постоянные ссылки). Таким образом, вместо того, чтобы запрашивать базу данных для строки, которая имеет конкретный идентификатор, вы запрашиваете базу данных для строки, которая имеет определенный слаг. Вам не нужно знать идентификатор, чтобы получить запись.
Пока названия продуктов уникальны, это не должно быть проблемой. Поиск по продукту по уникальному имени, а не по числовому идентификатору, займет больше времени (по крайней мере, незначительно), пока столбец проиндексирован.
Как вы можете знать или не знать, URL-адреса переписываются с помощью модуля Apache mod_rewrite. Как уже упоминалось, WordPress на заднем плане назначает слаг после очистки заголовка или названия сообщения.
Но, чтобы ответить на ваш вопрос, вы описываете особенность Wordpress "Pretty Permalinks", и вы можете узнать больше об этом в кодексе Wordpress. Более новые версии Wordpress выполняют внутреннюю переписывание (нет.htaccess editin, вместо этого wp_rewrite). Вот почему вы увидите тот же набор правил для любой структуры постоянных ссылок.
Хотя, если вы покопаетесь, вы сможете найти старые правила переписывания. Например:
RewriteRule ^([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$ /index.php?year=$1&monthnum=$2&day=$3 [QSA,L]
Будет принимать URL как /2008/01/01/
и направить его /index.php?year=2008&monthnum=01&day=01
(и загрузить категорию даты).
Но, как уже упоминалось, страница, как product-name
существует только потому, что Wordpress уже очистил заголовок сообщения и сохранил его как поле в базе данных.
Wordpress имеет поле в таблице wp_posts для слаг. Когда вы создаете сообщение, оно создает слаг из заголовка сообщения (если это так, как вы его настроили), заменяя пробелы тире (или, я думаю, вы можете установить подчеркивание). Он также удаляет апострофы, запятые или еще много чего. Я считаю, что это также ограничивает общую длину пули.
Итак, короче говоря, он не декодирует динамически URL-адрес в заголовок сообщения - в таблице есть поле, которое напрямую соответствует версии URL-адреса названия сообщения.