2010-05-28 1 views
6

Я заметил, что некоторые сайты (в том числе старого http://careers.stackoverflow.com 1.0) имеют строки запроса, которые выглядят следующим образом:В чем разница между/123 и /? 123?

http://somewebapp.example/?123

по сравнению с:

http://somewebapp.example/123 или http://somewebapp.example/id/123

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

И как бонус, как реализовать первый пример в PHP, учитывая, что 123 является основным ключом некоторой строки в таблице базы данных? (Мне просто нужно знать, как получить 123 из URL, я уже знаю, как запрос к базе данных для первичного ключа 123.)

EDIT [5/28]: Ой, забыл, чтобы все знать что я знаю, каковы последние два URL-адреса, как они работают и как их реализовать. Спасибо за напоминания, хотя, я думаю, у меня были некоторые несвязанные заблуждения, которые были в любом случае прояснены!

ответ

9

Первый легче реализовать; все после? является частью строки запроса. Веб-сервер загружает страницу, указанную до?, И обрабатывает строку запроса отдельно (в PHP она доступна через $_GET)

Во втором примере разработчику необходимо настроить веб-сервер для перенаправления всех запросов на специальную страницу (так как нет /123 страницы на сервере), который будет затем разобрать URL, чтобы выяснить, что было предложено

что касается последнего вопроса, то 123 будет отображаться в $_GET как ключ, так key($_GET) будет работать при условии, это единственное, что вы передаете в строке запроса

+0

Спасибо! Принято для ответа на оба вопроса. Не понял, что было так просто захватить ключ – BoltClock

0

Первый пример - строка запроса; второй и третий примеры нет. Подробнее о URL-адресах можно узнать от What Every Developer Should Know About URLs. Чтобы использовать идентификатор из строки запроса, вам нужно проанализировать его с помощью соответствующей библиотеки.

0

Каковы причины, по которым разработчики предпочитают использовать URL своих веб-приложений, используя первый пример, а не второй и третий примеры?

Эстетика. Читайте о cool URIs, чтобы получить хороший совет по разработке URI.

как бы один реализовать первый пример в PHP

Вы ищете $_SERVER['PATH_INFO'], но будьте осторожны: некоторые хостинг-провайдеров поместить фиктивные вещи там.

В таких ситуациях вам необходимо использовать mod_rewrite или аналогичные ..

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(\d+) /index.php?id=$1 [L,QSA] 

Таким образом, вы можете получить идентификатор из $_GET['id']

+0

Является ли это исключительно тем, что они выделяются из обычных URL-адресов PATH_INFO, которые так распространены в наши дни? – BoltClock

0

На самом деле это связано с правилами modRewrite или конфигурации Apache. Некоторые структуры, такие как Code Ignitor, используют эти маршруты, чтобы направить вас на страницу, которая на самом деле технически не существует в этом физическом местоположении. Он анализируется, и структура определяет, какой вид является подходящим для отображения. Некоторые правила позволяют веб-серверу передавать что-либо после параметра/в качестве параметра, чтобы определить, доступен ли допустимый маршрут из фреймворка. Некоторые системы не делают этого автоматически, и поэтому помещается знак вопроса, чтобы заставить его быть переданным в фреймворк как маршрут

Если вы хотите получить 123 из первого экземпляра, вам нужно вытащить запрос query_string

1

Вы можете получить доступ к нему с помощью PHP

$_SERVER['QUERY_STRING'] 
1

Первый URL использует параметры запроса для отправки данных. Более поздняя - это форма URL-адреса REST, которая на самом деле указывает на ресурс с ID 123

0

Если вы используете Apache (и вы можете сделать то же самое на других серверах, но я не знаю деталей), что-то вроде эти линии будут делать интересный трюк:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.+)$ index.php/$1 
</IfModule> 

Правило: Если запрошенная страница не является файлом !-f или каталог !-d затем, вместо того, чтобы давать ошибку page not found, груз index.php и передать запрашиваемое путь на этот скрипт в форма $_SERVER['PATH_INFO'] (ее также можно извлечь из $_SERVER['REQUEST_URI'].

Или вы могли бы сказать Apache переписать на index.php?$1, и в этом случае путь можно извлечь из $_SERVER['QUERY_STRING']. (В этом случае вы должны использовать аргумент QSA, чтобы добавить текущую строку запроса (если таковая имеется), без каких-либо проблем.