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

Другие вопросы по тегам