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

Я разрабатываю веб-сайт с помощью PHP и Apache. Я хочу повернуть свои URL из

www.example.com/book.php?book=title

во что-то вроде этого, если это возможно, конечно:

www.example.com/book/title

Заметьте, что заголовок книг уникален и не может быть повторен.

Я читал об этом, но ни одно из сообщений не было достаточно четким для новичка как я. Вы парни знают какое-либо учебное руководство, которое объясняет это?

Спасибо.

7
задан rlc 16 May 2010 в 19:11
поделиться

4 ответа

Немного расширяя ответы @ 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&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 цента в супе, чтобы еще немного размешать.

Заявление об ограничении ответственности: Все вышеперечисленные правила перезаписи (как и все остальное, конечно) написаны мне в голову (после нескольких кружек пива) и нигде не проверялись.

0
ответ дан 7 December 2019 в 05:19
поделиться

Функция, которую вы ищете, называется «перезапись 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: в большинстве случаев эта функция является встроенной. Вы должны «научиться» пользоваться фреймворком. Если ваш сайт уже готов, это не лучший вариант .. .

2
ответ дан 7 December 2019 в 05:19
поделиться

Вот как это делает 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-адреса, а затем выполнит поиск в базе данных или сделает все, что нужно, с этим именем.

3
ответ дан 7 December 2019 в 05:19
поделиться

Большинство решений полагаются на mod_rewrite . См. Примеры здесь .

0
ответ дан 7 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: