В чем разница между / 123 и /? 123? - PullRequest
6 голосов
/ 28 мая 2010

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

http://somewebapp.example/?123

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

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

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

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

РЕДАКТИРОВАТЬ [5/28]: Упс, забыл сообщить всем, что я знаю, что такое последние два URL, как они работают и как их реализовать. Спасибо за напоминания, хотя, я думаю, у меня были некоторые несоответствующие заблуждения, которые все равно были случайно прояснены!

Ответы [ 7 ]

9 голосов
/ 28 мая 2010

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

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

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

1 голос
/ 28 мая 2010

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

1 голос
/ 28 мая 2010

Вы можете получить к нему доступ через php, используя

$_SERVER['QUERY_STRING']
0 голосов
/ 28 мая 2010

Если вы используете 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, чтобы добавить текущую строку запроса (если есть), ничего не путая.

0 голосов
/ 28 мая 2010

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

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

0 голосов
/ 28 мая 2010

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

Эстетика. Прочитайте о классных URI , чтобы получить полезные советы о том, как проектировать 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 голосов
/ 28 мая 2010

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

...