2009-03-25 44 views
10

Tôi đang xuất một hình ảnh lên trình duyệt bằng cách sử dụng đối tượng Zend_Controller_Response. Đó là ý định của tôi để áp dụng bộ nhớ đệm cho hình ảnh, tuy nhiên có điều gì đó khiến tiêu đề Cache-Control bị ghi đè.Tiêu đề kiểm soát bộ nhớ cache được sửa đổi theo phiên PHP?

Mã của tôi là như sau:

$this->getResponse() 
    ->setHeader('Last-Modified', $modifiedTime, true) 
    ->setHeader('ETag', md5($modifiedTime), true) 
    ->setHeader('Expires', $expires, true) 
    ->setHeader('Pragma', '', true) 
    ->setHeader('Cache-Control', 'max-age=3600') 
    ->setHeader('Content-Type', $mimeType, true) 
    ->setHeader('Content-Length', $size, true) 
    ->setBody($data); 

Sản lượng (như xem trong Firebug) là:

Tiêu đề phản hồi

ngày
Wed, 25 Tháng 3 2009 10:34:40 GMT
server
Apache/2.2.3 (Ubuntu) mod_ssl/2.2.3 OpenSSL/0.9.8c
Expires
Thu, ngày 26 tháng 3 năm 2009 10:34:41 GMT
Cache-Control
no-store , no-cache, phải xác nhận lại, bưu điện kiểm tra = 0, trước kiểm tra = 0, max-age = 3600
Last Modified
ETag
d3ef646c640b689b0101f3e03e08a524
Content-Length
X-UA-Tương thích
IE = EmulateIE7
X-Robots-Tag
noindex
Keep-Alive
timeout = 15, max = 100
kết nối
Keep- Alive
Loại nội dung
image/jpeg

Request Headers

chủ
khall. ####. ###. ###### com.
User-Agent
Mozilla/5.0 (X11; U; Linux i686; en-US; rv: 1.9.0.7) Gecko/2009030422 Ubuntu/8.04 (hardy) Firefox/3.0 .7
Chấp nhận
Văn bản/html, ứng dụng/xhtml + xml, application/xml; q = 0.9, */*; q = 0,8
Accept-Language
en-gb, en; q = 0,5
Accept-Encoding
gzip, deflate
Accept-Charset
ISO-8859-1, utf-8; q = 0,7, *; q = 0.7
Giữ-Alive
kết nối
giữ-sống
Referer
http: //khall.####.###.######.com/
Cookie
PHPSESSID = abf5056e1289d3010448107632a1c1bd

Như bạn có thể thấy, việc kiểm soát bộ nhớ cache được sửa đổi để bao gồm :

no-store, no-cache, phải xác nhận lại, bưu điện kiểm tra = 0, trước kiểm tra = 0

nghi ngờ của tôi là hướng tới các cookie phiên được gửi trong yêu cầu. Có ai biết một cách để gửi tiêu đề mà tôi yêu cầu, nhưng vẫn giữ phiên trong yêu cầu? Ứng dụng của tôi chạy qua bootstrap và các phiên được xử lý bằng Zend_Session.

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

13

Từ các tài liệu Zend_Controller, phần 10.9. The Response Object

setHeader ($ name, $ value, $ thay = false) được sử dụng để thiết lập một cá nhân tiêu đề. Theo mặc định, nó không thay thế các tiêu đề hiện có của cùng một tên trong đối tượng; tuy nhiên, việc đặt $ thay thế thành true sẽ buộc nó làm như vậy.

Sự cố bạn đang gặp phải là độ tuổi tối đa = 3600 đang được thêm vào tiêu đề kiểm soát bộ nhớ cache, thay vì thay thế nó. Hãy thử đặt $ thay thế thông số thành đúng.

+0

GAH! Tôi nên tự đập mình vào mặt. Tôi nghĩ rằng tôi đã vượt qua tham số đó! Bạn hoàn toàn đúng, đó là câu trả lời. –

+0

Hehe, tôi luôn làm thế! Bằng chứng? xem http://stackoverflow.com/questions/657600/how-do-i-correctly-create-a-zend-feed – karim79

26

Bạn đúng bằng cách giả sử rằng hành vi này được kết nối với cơ chế phiên trong PHP. Có một cài đặt cấu hình session.cache_limiter kiểm soát tiêu đề bộ nhớ đệm HTTP sẽ được gửi cùng với phản hồi. Giá trị mặc định thiết lập ở đây là nocache mà gửi

Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 

Bạn ghi đè lên tất cả các tiêu đề trong phạm vi điều khiển của bạn bên cạnh những Cache-Control -header (bạn chỉ thêm max-age=3600 bạn đang ngồi ở đây).

giải pháp có thể là:

  1. thay đổi cấu hình PHP (session.cache_limiter) để ví dụnone - nhưng điều này có thể giới thiệu các vấn đề cho các ứng dụng PHP khác
  2. thiết lập session.cache_limiter trên mỗi yêu cầu sử dụng session_cache_limiter()
  3. ghi đè lên Cache-Control -header đầy đủ trong điều khiển của bạn với chuỗi định

Các giá trị có thể cho session.cache_limitersession_cache_limiter() là:

none: không có tiêu đề sẽ được gửi

nocache:

Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 

tin:

Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: private, max-age=10800, pre-check=10800 

private_no_expire:

Cache-Control: private, max-age=10800, pre-check=10800 

công:

Expires: pageload + 3 hours 
Cache-Control: public, max-age=10800 
+0

Cảm ơn bạn đã trả lời. Vấn đề là mã hóa vội vàng của tôi, như karim79 đã chỉ ra: vấn đề là dựa trên khung công tác Zend hơn. Cảm ơn sự thấu hiểu, mặc dù. –

+0

Tốt, điều này đã giải quyết được câu hỏi của tôi: http://stackoverflow.com/questions/1937581/php-remove-http-header –

Các vấn đề liên quan