#.htaccess #mod-rewrite
Вопрос:
Мне нужно изменить URL-адреса на моем веб-сайте с
http://www.example.com/games.php?game=600
Для
http://www.example.com/games/gamename
«имя игры» — это поле в базе данных MySQL.
я рисую это так на заголовке страницы <?=$data['enname']?>
Я думаю, мне нужно сделать это в .htaccess
файле с RewriteRule
но я не знаю, как именно
кто-нибудь может помочь?
Комментарии:
1. Правило перезаписи в .htaccess может передать имя в вашем красивом URL-адресе сценарию путем вызова
/games.php?name=gamename
, но я не могу обрабатывать запросы в базе данных. Можете ли вы подробнее рассказать о том, что вы пробовали и с какими конкретными ошибками столкнулись?
Ответ №1:
То, что вы предлагаете, невозможно в .htaccess
одиночку — откуда 600
ожидается, что это произойдет? Чтобы сделать это в .htaccess
одиночку, 600
необходимо будет присутствовать в запрошенном URL. например. /games/600/gamename
Затем вы могли бы сделать что-то вроде следующего, .htaccess
чтобы сопоставить /games/600/gamename
с /games.php?game=600
:
Options -MultiViews
RewriteEngine On
RewriteRule ^/games/(d )/ games.php?game=$1 [L]
ПРИМЕЧАНИЕ: Здесь необходимо отключить многовидовые просмотры, так как вы используете сегмент URL-пути, который напрямую сопоставляется с базовым именем существующего файла. т. е. /games
и /games.php
. Если бы мультивидение было включено, то /games.php
оно вызывалось бы (с помощью mod_negotiation) без каких-либо параметров URL.
В противном случае, если вы хотите использовать URL /games/gamename
-адрес (без «идентификатора»), вам понадобится внешний контроллер. например. Перепишите все запросы games.php
(как и раньше), но затем выполните поиск gamename
в вашей базе данных (для получения «идентификатора») с помощью PHP и предоставьте соответствующий контент.
Например:
Options -MultiViews
RewriteEngine On
RewriteRule ^/games/([w-] )$ games.php?gamename=$1 [L]
Обратите внимание на изменение параметра URL. «Имя игры» передается вашему сценарию вместо «идентификатор». Затем вы ищете «идентификатор» игры в своем games.php
сценарии, чтобы предоставить соответствующий контент.
ОБНОВЛЕНИЕ: Очевидно, для этого требуется, чтобы «имя игры» было уникальным (и индексированным) полем в вашей базе данных. Если нет, то у вас нет другого выбора, кроме как включить «идентификатор» (например 600
) в запрошенный URL-адрес, как упоминалось в первой половине моего ответа.
Комментарии:
1. 600 — это идентификатор игры в базе данных sql
2. @yogev Хорошо, но вы также заявили: «»имя игры» — это поле в базе данных MySQL». Если «имя игры» не является уникальным, то «идентификатор» (т. е.
600
) должен присутствовать в исходном URL — адресе-как указано в первой части моего ответа. (Я обновил свой ответ, чтобы прояснить это.)3. @yogev, пожалуйста. Если мой ответ помог, пожалуйста, отметьте его как «принято» (галочка слева под стрелками для голосования), чтобы помочь другим читателям, удалите его из очереди вопросов без ответа и покажите свою признательность :). Когда у вас будет более 15 представителей, вы также сможете озвучивать ответы, которые сочтете полезными. Спасибо, очень признателен. 🙂