Я заметил, что некоторые сайты (включая старый 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, как они работают и как реализовать их. Спасибо за напоминания, хотя, я думаю, что у меня были некоторые несвязанные неправильные представления, которые были случайно разъяснены так или иначе!
Первое реализовать проще; все после? является частью строки запроса. Веб-сервер загружает страницу, указанную перед знаком?, И обрабатывает строку запроса отдельно (в PHP она доступна через $ _ GET
)
Во втором примере разработчику необходимо настроить веб-сервер для перенаправления все запросы к специальной странице (поскольку на сервере нет страницы / 123
), которая затем проанализирует URL-адрес, чтобы выяснить, что было запрошено.
Что касается вашего последнего вопроса, 123
будет отображаться в $ _ GET
как ключ, поэтому ключ ($ _ GET)
будет работать, если это единственное, что вы передаете в строке запроса
Первый URL использует параметры запроса для отправки данных. Последний представляет собой форму URL-адреса REST
, который фактически указывает на ресурс с ID 123
Вы можете получить к нему доступ с php, используя
$_SERVER['QUERY_STRING']
Если вы используете 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
, чтобы добавить текущую строку запроса (если есть), ничего не испортив.
По каким причинам разработчики предпочитают реализовывать 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']
Первый пример - это строка запроса; второй и третий примеры - нет. Дополнительные сведения об URL-адресах см. В Что каждый разработчик должен знать об URL-адресах . Чтобы использовать идентификатор из строки запроса, вам необходимо проанализировать его с помощью соответствующей библиотеки.
На самом деле это связано с правилами modRewrite или конфигурациями apache. Некоторые фреймворки, такие как Code Ignitor, используют эти маршруты, чтобы направить вас на страницу, которая на самом деле технически не существует в этом физическом месте. Она анализируется, и фреймворк определяет, какое представление уместно отобразить. Некоторые правила позволяют веб-серверу передавать что-либо после / в качестве параметра, чтобы определить, доступен ли действительный маршрут от фреймворка. Некоторые системы не делают этого автоматически, поэтому ставится знак вопроса, чтобы заставить его быть переданным фреймворку в качестве маршрута
Если вы хотите получить 123 из первого экземпляра, вам нужно вытащить запрос query_string