Как превратить динамический URL в статический URL

Я разрабатываю веб-сайт с использованием 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&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&param=$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 . См. Здесь примеры.