Я разрабатываю веб-сайт с помощью PHP и Apache. Я хочу повернуть свои URL из
www.example.com/book.php?book=title
во что-то вроде этого, если это возможно, конечно:
www.example.com/book/title
Заметьте, что заголовок книг уникален и не может быть повторен.
Я читал об этом, но ни одно из сообщений не было достаточно четким для новичка как я. Вы парни знают какое-либо учебное руководство, которое объясняет это?
Спасибо.
Немного расширяя ответы @ Rodolphe и @ Galen.
Если ваши потребности в переписывании URL-адресов ограничены, подойдет жестко запрограммированный .htaccess
с правилами, описанными в примере Родольфа.
Однако, как предполагает Гален, ваши потребности могут быть неизвестны, или вы, возможно, захотите расширить их позже, без необходимости касаться ваших правил переписывания, когда они у вас будут работать.
Распространенный способ сделать это - разработать приложение на основе схемы URL-адресов, которая www.host.com/controller/action/parameter
. Примером такого URL-адреса может быть www.host.com/book/view/1
, который затем может обрабатываться внутри компании различными способами.
1)
У вас есть отдельные сценарии для каждого контроллера. Затем вы переписываете каждый запрос в форму $ controller.php? Action = $ action & param = $ param
, перенаправляя несовпадающие или недопустимые запросы на контроллер по умолчанию.
# Serve files and directories as per usual,
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
# If the request uri doesn't end in .php
# and isn't empty, rewrite the url
RewriteCond %{REQUEST_URI} !.php$
RewriteCond %{REQUEST_URI} !^$
# Try matching against a param request first
RewriteRule (.*?)/(.*?)/(.*?) $1.php?action=$2¶m=$3 [L]
# If it didn't match, try to match an action
RewriteRule (.*?)/(.*?) $1.php?action=$2 [L]
# redirect all other requests to index.php,
# your default controller
RewriteRule .* index.php [L]
2)
У вас есть единственная точка входа (или фронт-контроллер), на которую вы перенаправляете каждый запрос, и этот фронт-контроллер обрабатывает перенаправление запроса соответствующему контроллеру.
# Redirect all requests that isn't a file or
# directory to your front controller
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
RewriteRule .* index.php [L]
Общие резервные правила не будут добавлять никаких параметров к контроллеру по умолчанию / переднему контроллеру. Однако, поскольку это внутреннее перенаправление, у вас будет доступ к REQUEST_URI
в PHP, чтобы определить, что вам следует делать.
Это, конечно, не единственные варианты. Просто мои 2 цента в супе, чтобы еще немного размешать.
Заявление об ограничении ответственности: Все вышеперечисленные правила перезаписи (как и все остальное, конечно) написаны мне в голову (после нескольких кружек пива) и нигде не проверялись.
Функция, которую вы ищете, называется «перезапись URL».
Вы можете сделать это вручную: вы объясните шаблон, используя регулярное выражение, и веб-сервер переводит запросы. В Apache он обычно находится в файлах htaccess или в директории в httpd.conf. см. официальный документ здесь: http: //httpd.apache. org / docs / 2.0 / misc / rewriteguide.html
Это не так просто настроить, особенно отладку регулярных выражений.
Что касается вашей проблемы, попробуйте следующее правило:
RewriteEngine on
RewriteRule ^book/(.*)$ book.php?book=$1 [L]
Другой вариант - использование фреймворка php: в большинстве случаев эта функция является встроенной. Вы должны «научиться» пользоваться фреймворком. Если ваш сайт уже готов, это не лучший вариант .. .
Вот как это делает kohana (и 99,99% фреймворков php)
Добавление файла .htaccess (при использовании apache)
# Turn on URL rewriting
RewriteEngine On
RewriteBase /
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT,L]
Это перенаправляет все ссылки на index.php. index.php будет своего рода фронт-контроллером, который загружает скрипты на основе URL-адреса
Итак, в вашем примере:
localhost / book / title
будет загружен index.php. Он войдет в URL-адрес и загрузит страницу (контроллер), которая фактически сделает всю работу. в этом случае возможно books.php. books.php получит название книги из URL-адреса, а затем выполнит поиск в базе данных или сделает все, что нужно, с этим именем.
Большинство решений полагаются на mod_rewrite . См. Примеры здесь .