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