Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: *.gif?param=xxx - насколько корректно?
 
 автор: poli1   (19.10.2012 в 17:49)   письмо автору
 
 

Читая форум, наткнулась на несколько непонятных для меня вещей.
Объясните, пожалуйста, почему это работает? и насколько вообще корректно использование таких конструкций?

<?php  
echo "<img src=\"1.gif?nocache=".time()."\">"
?>

или подобное
<? 
echo '<a href="text.txt?rnd='.time().'">Некий текстовый файл</a>'
?> 


Что это за передача параметров не php-документу?

И верно ли, что такие конструкции решают проблему кэширования (т.е. в первом случае, например, картинка 1.gif будет всегда загружаться с сервера, а не из кэша браузера)?

  Ответить  
 
 автор: confirm   (19.10.2012 в 18:37)   письмо автору
 
   для: poli1   (19.10.2012 в 17:49)
 

Серверу вообще можно игнорировать передачу этих параметров, ему они не нужны, если только по ним не производятся операции. Достаточно просто - src=\"1.gif?".time()
А вот браузер действительно не будет обращаться к кешу, а к серверу, так как для него параметр/значение всегда новое.

  Ответить  
 
 автор: poli1   (19.10.2012 в 21:39)   письмо автору
 
   для: confirm   (19.10.2012 в 18:37)
 

И все-таки, меня интересует теоретический момент - почему это работает?
почему никто (ни браузер, ни сервер) не ругается, почему все понимают эту конструкцию? где это прописано? в протоколе HTTP?

я понимаю так.
1) например, у меня на сервере есть файл 1.php
<?php /* file 1.php */ ?>
<img src="w.jpg">


в браузере в адрес. строке вызываю localhost/1.php
браузер посылает на сервер
GET 1.php HTTP/1.1

и получает ответ
HTTP/1.1 200 OK
с текстом
<img src="w.jpg">

видит, что есть картинка (тег img) и посылает снова запрос серверу
GET w.jpg HTTP/1.1

и получает ответ
HTTP/1.1 200 OK
с картинкой
- выводит картинку
2) но теперь файл 2.php
<?php  
/* file 2.php */
echo "<img src=\"w.jpg?1\">"
?>

почему, когда браузер видит, что есть картинка, он посылает запрос?
GET w.jpg?1 HTTP/1.1
почему он не поругается, что мол это файл изображения и он никаких параметров принимать не может?
почему сервер, получив такой запрос не поругается, что мол это же файл-изображения и у меня нет обработчика, которому я мог бы передать пришедший параметр.
3) и если уж браузеру все-равно, что он передает, а сервер, такой понятливый и отбрасывает ненужные ему параметры, то почему вся эта канитель с кэшированием и заголовками Cache-Control и т.п.?
пусть бы файлы стилей, js-файлы, файлы изображений подключались по этому принципу
<?php  /* file 3.php */
$ver=time();
?>
<link href=<? echo "'style.css?ver=".$ver."'"?> rel="stylesheet">
<? //...
echo "<img src=\"w.jpg?ver=".$ver."\">"
?>

и браузер всегда получал бы обновленную страницу. Если time() - это слишком часто, можно использовать $ver=1; где-то в файле настроек, и как только изменился, какой-то из файлов - поменял себе значение на 2 и т.д.
Но ведь так никто не делает. почему? это не правильно? не эффективно?

  Ответить  
 
 автор: confirm   (19.10.2012 в 22:13)   письмо автору
 
   для: poli1   (19.10.2012 в 21:39)
 

А почему браузер должен ругаться на src="w.jpg?1" ? Не браузер определяет контент возвращаемый по ссылке, а сервер выдает его браузеру. И для изображения может быть и такая ссылка src="image.php?id=12&t=1", и получив такую ссылку, сервер по указанным параметрам вернет браузеру соответствующее изображение.

Вы можете запретить кеширование с помощью переданных заголовков. Но если вы кешируете те же изображения, к примеру, страницы, но одно из них в тоже время не должно кешироватся, то и применяется данный метод. То есть, это не как правило, и не обязательный инструмент, поэтому и "Но ведь так никто не делает. почему?"

К примеру, вы кешируете файл стиля, но если вы его обновили, то вы заинтересованы в том, чтобы браузер получил новые стили, в этом случае достаточно прибегнуть к данному методу, но при этом зачем это же самое прописывать буквально для всего на странице.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования