Я разрабатываю веб-сайт с использованием PHP и Apache. Я хочу превратить свои URL-адреса из
www.example.com/book.php?book=title
во что-то подобное, если это возможно, конечно:
www.example.com/book/title
Обратите внимание, что название книг уникально и не может быть повторено.
Я прочитал об этом, но ни одна из должностей не была достаточно ясной для новичка, подобного мне. Вы, ребята, знаете какой-нибудь учебник, который объясняет это?
Благодарю.
Расширяясь в ответах Родольфа и Галена, немного.
Если ваши потребности в перезаписи URL ограничены, жестко закодированный .htaccess
с правилами, описанными в примере Родольфа, будет хорошо.
Однако, как предлагает Гален, ваши потребности могут быть неизвестны, или вы можете захотеть расширить их позже, без необходимости прикасаться к правилам перезаписи, как только вы их будете работать.
Обычный способ сделать это – создать приложение вокруг схемы URL, которая является www.host.com/controller/action/parameter
. Примером такого URL может быть www.host.com/book/view/1
, который затем можно было бы внутренне обрабатывать несколькими способами.
1)
У вас есть отдельные сценарии для каждого контроллера. Затем вы переписываете каждый запрос в форму $controller.php?action=$action¶m=$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 цента в супе, чтобы немного пошевелиться.
Отказ от ответственности: все вышеперечисленные правила переписывания (как и все остальное, конечно) написаны прямо на моей голове (после нескольких сортов пива) и нигде не тестировались.
Я создал внутреннюю ссылку в статическом формате, например, «http://www.example.com/casestudy/34» на моей веб-странице.
И я написал в файле .htaccess следующий код:
Options +FollowSymLinks RewriteEngine On RewriteBase / RewriteRule ^casestudy/([^-]+) /casestudy_details.php?id=$1 [R=301,QSA,L]
Функция, которую вы ищете, называется «переписывание URL».
Вы можете сделать это вручную: вы объясняете шаблон, используя регулярное выражение, и веб-сервер переводит запросы. С Apache он обычно встречается в файлах htaccess или directyl в httpd.conf. см. официальный документ. здесь: http://httpd.apache.org/docs/2.0/misc/rewriteguide.html
Это не так "легко" настроить, особенно отлаживая регулярные выражения.
Что касается вашей проблемы, попробуйте следующее правило:
RewriteEngine on RewriteRule ^book/(.*)$ book.php?book=$1 [L]
Другим вариантом будет использование php-рамки: большая часть времени, эта функция встроена. Вы должны «учиться», хотя как использовать фреймворк. Если ваш сайт уже завершен, это не самый лучший вариант …
Вот как это делает кохана (и 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]
Это перенаправляет все URL-адреса index.php. index.php будет своего рода фронт-контроллером, который загружает скрипты на основе URL-адреса
Итак, в вашем примере:
локальный / книга / название
index.php будет загружен. Он войдет в URL-адрес и получит загрузку страницы (контроллера), которая фактически выполнит всю работу. в этом случае возможно books.php. books.php получит название книги из URL-адреса, а затем будет искать базу данных или делать то, что имеет к этому имени.
Большинство решений полагаются на mod_rewrite . См. Здесь примеры.