В общем-то вопрос не специфичный для парсера, но тем не менее не решенный :( В уроках на примере гостевой книги показано, что на пост-запрос надо отвечать перенаправлением (в примере использован location с текущим адресом). Это не работает — при обновлении страницы форма пытается переотправиться. Пробовал заменить заголовком refresh — помогло везде, кроме фаерфокса (в ИЕ еще не смотрел). Добавление задержки перед рефрешем ничего не меняет — форма при обновлении пытается переотправиться. Собственно, есть ли какое-то универсальное решение, как отвечать на пост-запросы, чтобы избежать случайной повторной отправки формы. Что-то вроде good practice.
При этом браузер пытается перейти по адресу То есть путь интерпретируется как относительный. Если его указать явно, не используя значение переменной - все работает хорошо. Почему так может происходить, и как от этого избавиться?
И еще: можно ли как-нибудь явно указать статус ответа? В документации к классу response ничего не нашлось :(
показано, что на пост-запрос надо отвечать перенаправлением (в примере использован location с текущим адресом). Это не работает
Надо просто правильно перенаправлять. Заголовок Location: /uri (начинающийся со /) считается в apache внутренним редиректом и обрабатывается внутри apache, не доходя до пользователя. Поэтому надо либо выдавать $response:location[./] (./current-page.html), либо $response:location[http://полный url].
Спасибо, но все никак не станет на место. Такое ощущение, что location сохраняет метод запроса.
$response:location[.$request:uri]
сначала перенаправляет на site.com/address методом пост, а затем на site.com/address/address уже методом гет. Очевидно, что где-то моя ошибка, но никак не найду.
То, что начинается с . - это относительный путь, относительно текущего uri. Поэтом .$request:uri - это ерунда какая-то. Если uri /test1/test2/, то ./ - это /test1/test2/, ../ - это /test1/, ./test3/ или test3/ - это /test1/test2/test3/.
Вскорости после того, как спросил - понял, в каком месте туплю, спасибо, теперь окончательно разобрался с этим моментом. Чтобы средиректить на текущую страницу без редиректа на уровне сервера использую ./ Изначально смутило, что в примере в учебнике используется $response:location[$request:uri] при том, что в самой переменной содержится путь, начинающийся с / — таким образом редирект сработает на уровне сервера.
Однако такое объяснение работы с путями не снимает вопроса о том, почему
перенаправляет на несмотря на то, что в $env:HTTP_REFERER содержится урл, начинающийся с протокола, а никак не с точки или слеша. При этом если указать в виде литерала — все работает хорошо. Какой основополагающий принцип я не понимаю, если такое поведение мне кажется странным?
P.S: прошу прощения за такой поток однотипных вопросов, однако я не могу пользоваться како-то технологией или приемом, пока не буду понимать, как это работает, а найти описание тонкостей редиректа в интернете пока не получается.
Это необходимое но не достаточное действие при обработке пост-данных от формы. Это предотвратит повторное выполнение обработки, а для пользователя полезно еще и подавить назойливый запрос браузера на переотправку формы при обновлении страницы.