parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

делюсь опытом

nolar 22.07.2004 14:24

1) response:location и response:refresh - взаимозаменяемые конструкции с небольшими различиями в понимании со стороны браузеров. использовать стоит только что-то одно

2) а теперь собственно опыт. использовать $response:что-то-там обновление НЕЖЕЛАТЕЛЬНО.
почему? объясняю: некоторые браузеры (конкретно тестировалось на opera 6.1 или 6.01 и частично на IE6) кешируют заголовки страниц и при повторный на них заход приводит к чтение заголовков с целью узнать дату изменения и тп файла из кеша. тупые браузеры, читая хеадеры из кеша, читают и рефреш, который при $response:* тоже передается хеадером. и переходят куда их посылали раньше, даже если в нынешний момент контент у страницы совсем другой. пример: страница защищенная паролем. если сессии нет - редирект на страницу входа. елси есть - вывод данных. заходим первый раз без сессии - получаем редирект в хеадере. идет по редиректу, логинимся и снова заходим на эту страницу. браузер видит редирект в хеадере и прется опять на логин пейдж, хотя сессия УЖЕ есть, и передана на страницу.

Рефрешы нужно делать тэгами <meta http-equiv="refresh" content="0; url=....">. Почему? Потому что они находятся В ТЕЛЕ страницы, и страбатывают только когда страница открыта. Они не кешируются в браузере и при проверке полей кеша не срабатывают. Единственное что может быть проблематично - решение о редиректе не всегда принимается в <head>...</head>, чаще в <body>...</body>. Но эот не особая проблема, так как большинство браузеров (вроде как все) по крайней мере в случае HTML (насчет XHTML не знаю) реагируют на <meta> независимо от их положения. ТО есть можно выводит и в <body>, хотя это не "по учебнику".

Вот мой оператор редирект (заметьте, если приспичит, вы всегда можете поменять способ редиректа по всему сайту, изменив только в операторе; если delay не задан, делает скрытый редирект хеадером; если задан, даже если 0 - метой):
@redirect[uri;delay][]
^if(!def $uri){$uri[$request:uri]}
^if(def $delay){
        $result[<meta http-equiv="refresh" content="$delay^; url=^taint[as-is][$uri]">]
}{
        $response:location[^taint[as-is][$uri]]
        $result[]
}
Приятного аппетита :)