Как сделать переписывание URL в PHP? - PullRequest
13 голосов
/ 24 июня 2009

Я пытаюсь реализовать перезапись URL в моем приложении PHP. Может кто-нибудь поделиться пошаговой процедурой реализации перезаписи URL в PHP и MySQL?

В моем приложении я хочу реализовать следующую перезапись URL, я хочу перенаправить

1. http://example.com/videos/play/google-io-2009-wave-intro
2. http://example.com/videos/play/203/google-io-2009-wave-intro

до

1. http://example.com/videos/play.php?title=google-io-2009-wave-intro
2. http://example.com/videos/play.php?id=203

Скажите, пожалуйста, как осуществить перезапись обоих URL любым из вышеперечисленных способов.

Еще одна вещь, какой URL будет наилучшим с точки зрения SEO, менеджмента, точки зрения приложения из следующих двух типов.

1. http://example.com/videos/play/google-io-2009-wave-intro
2. http://example.com/videos/play/203/google-io-2009-wave-intro

Ответы [ 9 ]

23 голосов
/ 24 июня 2009

Руководство для начинающих по mod_rewrite .

Обычно это будет не более чем включение модуля mod_rewrite (вероятно, он уже включен на вашем хосте), а затем добавление файла .htaccess в ваш веб-каталог. После того, как вы это сделали, у вас осталось всего несколько строк. Учебник, указанный выше, позаботится о вас.

Ради интереса, вот файл Kohana .htaccess для перезаписи:

# Turn on URL rewriting
RewriteEngine On

# Installation directory
RewriteBase /rootDir/

# Protect application and system files from being viewed
RewriteRule ^(application|modules|system) - [F,L]

# 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/
RewriteRule .* index.php/$0 [PT,L]

Что это будет делать, это принимать все запросы и направлять их через файл index.php. Так что, если вы посетили www.examplesite.com/subjects/php, вы можете посетить www.examplesite.com/index.php?a=subjects&b=php.

.

Если вы сочтете эти URL привлекательными, я бы посоветовал вам сделать еще один шаг и проверить MVC Framework (Model, View, Controller). По сути, это позволяет вам рассматривать ваш сайт как группу функций:

www.mysite.com / шутки

public function jokes ($page = 1) {
  # Show Joke Page (Defaults to page 1)
}

Или, www.mysite.com/jokes/2

public function jokes ($page = 1) {
  # Show Page 2 of Jokes (Page 2 because of our different URL)
}

Обратите внимание, как первый слеш вызывает функцию, а все последующие заполняют параметры этой функции. Это действительно очень приятно и делает веб-разработку намного веселее!

7 голосов
/ 24 июня 2009

Вы не можете сделать это только с помощью PHP. Вам нужно заглянуть в mod_rewrite (при условии, что вы используете apache).

6 голосов
/ 24 июня 2009

Использование переписывания модов:

RewriteRule ^videos/play/([0-9]+)/([^.]+)$ play.php?id=$1&name=$2

example.com / play.php? ID = 203 & имя = Google-IO-2009-волновую интро

будет работать как

example.com / видео / воспроизведение / 203 / Google-IO-2009-волновой интро

3 голосов
/ 24 июня 2009

Имейте в виду, что перенаправление - это не то же самое, что переписывание.

Перенаправление - это когда сервер получает запрос и ответ отправляется как перенаправление. Например, вы запрашиваете страницу www.example.com/page. Когда сервер получает это, либо страница, либо сервер самостоятельно выдают команду перенаправления в браузер. Команда перенаправления в основном говорит «иди сюда: новая страница». В PHP это в форме заголовка ('Location: newpage.html');

Перезапись - это когда сервер получает запрос от браузера, а затем просматривает список соответствующих регулярных выражений для этого сайта. Если совпадение найдено, URL-адрес переписывается в эту форму и получает соответствующий ответ. Например, запрошенный URL-адрес www.example.com/specificpage может быть переписан (на стороне сервера) как www.example.com/?loadpage=specificpage. Браузер никогда не получает информацию заголовка о том, что он должен идти куда-то еще.

2 голосов
/ 24 июня 2009

Если ваш сервер поддерживает это (apache / mod_rewrite), вы можете использовать файл .htaccess, чтобы перенаправить посетителя.

Что-то вроде (просто черновик, адаптируйся под свои нужды ...):

RewriteEngine On
RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)/([0-9]+)/([-0-9a-zA-Z]+)/?$ /$1/$2.php?id=$3 [L]

для второго примера.

1 голос
/ 26 сентября 2009

Вы можете подойти к этому несколько иначе, чем предложенные выше, используя Front Controller, это распространенное решение для создания пользовательских URL-адресов и используется на всех языках, а не только в PHP. Вот руководство: http://www.oreillynet.com/pub/a/php/2004/07/08/front_controller.html

По сути, вы должны создать файл index.php, который вызывается для каждого URL-адреса, его задача - анализировать URL-адрес и определять, какой код следует запускать, на основе содержимого URL-адреса. Так, например, пользователь будет использовать URL-адрес, такой как http://example.com/index.php/videos/play/203/google-io-2009-wave-intro, а index.php извлечет оставшиеся элементы из URL-адреса (/ videos / play / 203 / google-io-2009-wave-intro) и возьмет В первой части загрузите php-файл с этим именем (videos.php или вы можете сделать так, чтобы он использовал play.php) и передайте параметры 203 и google-io.

Он фактически делает то же самое, что переписывает код в mod_rewrite, но имеет несколько преимуществ:

  1. Не требует слишком много кода mod_rewrite, если вы новичок в этом.
  2. Позволяет поместить весь код безопасности в одном месте - в index.php
  3. Легко менять URL-адреса, обрабатывать 404 и т. Д.

Вы можете удалить index.php из URL, используя mod_rewrite, см. Здесь: http://www.wil -linssen.com / expressionengine-removal-indexphp /

1 голос
/ 24 июня 2009

К сожалению, это действительно зависит от веб-сервера, а не от PHP. В зависимости от того, используете ли вы Apache или что-то еще, он должен сделать это до того, как ваш скрипт будет выполнен. Я использую mod_rewrite, и пример правила перезаписи выглядит так:

<Directory "/home/www/html">
    RewriteEngine On
    RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ /index.php/%{REQUEST_URI} [PT,L]
</Directory>

Приведенное выше правило в основном говорит, что если URL является допустимым путем к реальному файлу или каталогу, загрузите его В противном случае, запустите его через index.php.

1 голос
/ 24 июня 2009

Извините, что не дал вам подробного объяснения, но, возможно, вы могли бы взглянуть на DokuWiki в качестве отправной точки.

В своей настройке он принимает 3 режима:

  1. Обычные URL:? Id = zzz
  2. .htaccess rewrite: для перезаписи используется apache
  3. внутренняя (php) перезапись: URL в итоге выглядят как http://www.example.com/kb/doku.php/start

Это бесплатно, поэтому вы можете просто скачать и просмотреть код.

Как примечание, редирект apache, скорее всего, является лучшим решением, но чистый php также интересен в том случае, если ваш код будет работать на серверах IIS6, где переписывание не так просто, как в apache.

1 голос
/ 24 июня 2009

Прочитав комментарии и вопрос еще раз, я понял, что мой предыдущий ответ не совсем то, что вы ищете. Итак, вот некоторые дополнения: если вы хотите переписать / перенаправить / прокси-адреса URL-адресов, например, тогда пользователь наберет www.f1.com, он фактически увидит www.f2.com, но домен останется прежним, вам, вероятно, потребуется настроить обратный прокси с использованием Apache для этого. Это похоже на mod_rewrite.

Что касается второй части, так как современный сканер также выполняет анализ URL-ссылок, я думаю, что ваш первый вариант лучше с точки зрения производительности.

Предыдущий ответ:
А с помощью PHP вы можете достичь перенаправления как:

<?php
// Here you can parse the current location
// and decide whenever you want to go
// if $_SERVER[ 'PHP_SELF'] some conditions then....
header('Location: http://www.example.com/');
?>

С php.net . Здесь больше примеров.

...