Авг
14
Опубликовано: 14 Авг 2009
Рубрика: Паутина, Разработка | Автор: inst

Встала задача: отличить GET-запросы к серверу Apache от POST и в зависимости от результата перенаправить на нужную страницу.

Двоеточие, слэш, слэш

Для тех, кто только начинает разбираться в web-разработке, объясню разницу. Интерактивность страниц — одна из основополагающих частей современного интернета, эту самую интерактивность нам обеспечивает обмен данными между пользователем и web-страницей. Разработчики протокола HTTP много лет назад позаботились о том, чтобы существовало несколько способов передачи информации. Так вот, разница между POST и GET элементарна: при GET-запросе мы видим то, что ввели ранее в строке заголовка, а POST предусматривает скрытую передачу этой информации, так что как правило для логина на большинстве сайтов вполне логично используется именно POST.

Если говорить о случаях, когда может понадобится различать эти 2 типа, то это, например, желание заблокировать GET-доступ к странице в пользу POST. Такое блокирование используется в XML-RPC. В некоторых случаях при разграничивании POST и GET, думаю, даже можно снять некоторую нагрузку с сервера.

Ну, а что касается web-сервера Apache и его файла настроек (на виртуальном хостинге это .htaccess, на личном сервере можно и основной httpd.conf подправить), то стоит сказать, что прямого способа просто узнать метод передачи нет, но судить о нём можно при помощи переменной окружения THE_REQUEST. Делается это так:

RewriteEngine on

RewriteCond %{THE_REQUEST} ^POST [NC]
RewriteRule index.html post.php [L]

При этом, если у Вас в каталоге будет лежать файл index.html, то обычный запрос из браузера будет направлен именно к этому файлу, однако если в нём будет форма, указывающая на него же и передающая данные методом POST, то на самом деле эти данные будет обрабатывать post.php.

Отзывы

Алексей 19 Авг 2009 в 18:32 #

А можно спросить зачем это делать? Нельзя ли в header.php проверить есть ли массив $_POST и если есть перенаправить


inst 19 Авг 2009 в 18:42 #

Разумеется, Вы в праве проектировать свою разработку так, как Вам удобнее, однако есть 2 вещи о которых стоит помнить во время этого занятия:

Мой вариант даёт результат на уровне сервера, а предложенный Вами — клиент-серверное решение.
Как следствие предыдущего пункта — оптимизация проекта. Так как при увеличении объёмов посещаемости в описанных в посте случаях сервер будет опрашиваться дважды, вместо положенного одного раза.

Поправьте меня, если я неправ.

Надеюсь, я понятно ответил на Ваш вопрос.


T&K 17 Апр 2010 в 10:06 #

Это довольно хорошее решение! Бывают моменты когда нужно что-то перенаправить, и другими методами это выполнить бывает затруднительно.Например при вызове из флешки, когда не передается инфа из Referer, все вызовы передаются в корень сайта, вот тут самый раз пременить этот метод

RewriteEngine on
RewriteCond %{THE_REQUEST} ^POST [NC]
RewriteRule mont-blanc_Init.asp blanc/mont-blanc_Init.asp [L]
RewriteRule mont-blanc_Spin.asp blanc/mont-blanc_Spin.asp [L]
RewriteRule mont-blanc_Bonus1.asp blanc/mont-blanc_Bonus1.asp [L]
RewriteRule mont-blanc_Bonus2.asp blanc/mont-blanc_Bonus2.asp [L]

RewriteCond %{THE_REQUEST} GET [NC]
RewriteRule blanc.php blanc/index.php [L]
RewriteRule flashobject.js js/flashobject.js [L]
RewriteRule mont-blanc.swf blanc/mont-blanc.swf [L]
RewriteRule mont-blanc_Sound.swf blanc/mont-blanc_Sound.swf [L]


Комментировать
Имя:
Почта:
Сайт:
Сообщение:
В сообщении можно использовать такие теги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Это не спам