2010-04-22 2 views
5

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

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

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

www.example .com/book/title

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

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

Спасибо.

ответ

0

Расширение на ответах Родольфа и Галена немного.

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

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

2

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

2

Вот как Кохан (и 99,99% от фреймворок) делает это

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

3

Я создал внутреннюю ссылку в статическом формате, например, «http://www.example.com/casestudy/34» на моей веб-странице.

И я написал в файл .htaccess следующий код:

Options +FollowSymLinks 
RewriteEngine On 
RewriteBase/

RewriteRule ^casestudy/([^-]+) /casestudy_details.php?id=$1 [R=301,QSA,L] 
Смежные вопросы