Каково различие между/123 и/? 123?

Я заметил, что некоторые сайты (включая старый 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, как они работают и как реализовать их. Спасибо за напоминания, хотя, я думаю, что у меня были некоторые несвязанные неправильные представления, которые были случайно разъяснены так или иначе!

6
задан BoltClock 20 October 2011 в 10:27
поделиться

7 ответов

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

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

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

9
ответ дан 9 December 2019 в 22:30
поделиться

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

1
ответ дан 9 December 2019 в 22:30
поделиться

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

$_SERVER['QUERY_STRING']
1
ответ дан 9 December 2019 в 22:30
поделиться

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

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

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

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

0
ответ дан 9 December 2019 в 22:30
поделиться

По каким причинам разработчики предпочитают реализовывать 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
ответ дан 9 December 2019 в 22:30
поделиться

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

0
ответ дан 9 December 2019 в 22:30
поделиться

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

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

0
ответ дан 9 December 2019 в 22:30
поделиться
Другие вопросы по тегам:

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