|
|
|
| Читая форум, наткнулась на несколько непонятных для меня вещей.
Объясните, пожалуйста, почему это работает? и насколько вообще корректно использование таких конструкций?
<?php
echo "<img src=\"1.gif?nocache=".time()."\">";
?>
|
или подобное
<?
echo '<a href="text.txt?rnd='.time().'">Некий текстовый файл</a>';
?>
|
Что это за передача параметров не php-документу?
И верно ли, что такие конструкции решают проблему кэширования (т.е. в первом случае, например, картинка 1.gif будет всегда загружаться с сервера, а не из кэша браузера)? | |
|
|
|
|
|
|
|
для: poli1
(19.10.2012 в 17:49)
| | Серверу вообще можно игнорировать передачу этих параметров, ему они не нужны, если только по ним не производятся операции. Достаточно просто - src=\"1.gif?".time()
А вот браузер действительно не будет обращаться к кешу, а к серверу, так как для него параметр/значение всегда новое. | |
|
|
|
|
|
|
|
для: 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 и т.д.
Но ведь так никто не делает. почему? это не правильно? не эффективно? | |
|
|
|
|
|
|
|
для: poli1
(19.10.2012 в 21:39)
| | А почему браузер должен ругаться на src="w.jpg?1" ? Не браузер определяет контент возвращаемый по ссылке, а сервер выдает его браузеру. И для изображения может быть и такая ссылка src="image.php?id=12&t=1", и получив такую ссылку, сервер по указанным параметрам вернет браузеру соответствующее изображение.
Вы можете запретить кеширование с помощью переданных заголовков. Но если вы кешируете те же изображения, к примеру, страницы, но одно из них в тоже время не должно кешироватся, то и применяется данный метод. То есть, это не как правило, и не обязательный инструмент, поэтому и "Но ведь так никто не делает. почему?"
К примеру, вы кешируете файл стиля, но если вы его обновили, то вы заинтересованы в том, чтобы браузер получил новые стили, в этом случае достаточно прибегнуть к данному методу, но при этом зачем это же самое прописывать буквально для всего на странице. | |
|
|
|