הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   X-Sendfile שומר cache? (https://hosts.co.il/forums/showthread.php?t=99711)

GNS 08-09-12 13:36

X-Sendfile שומר cache?
 
אני משתמש באתר שלי בX-Sendfile להורדות. זה עובד טוב חוץ מלפעמים זיופים:

לפעמים למרות שהוא נשלח לקובץ X הוא מוריד קובץ Y שזה מאד מוזר.

שיניתי את ההדר:
קוד:

header("Cache-Control: no-cache");
header("Pragma: no-cache");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

וזה לא עזר.

יכול להיות שהשרת שומר איזה מטמון?

השמות של הקבצים שונים.

perfeito 08-09-12 13:40

תשתמש ב
Content-Disposition

GNS 08-09-12 13:42

ציטוט:

נכתב במקור על ידי perfeito (פרסם 856425)
תשתמש ב
Content-Disposition

אני משתמש..

קוד:

header("Content-disposition: attachment; filename=\"".$filename."\"");

אדיר 08-09-12 14:00

בהנחה שזה קשור למטמון, תנסה לפתור את זה באמצעות ההגדרות הרלוונטיות שבעמוד הבא:
https://tn123.org/mod_xsendfile

אם תספק קצת יותר קוד ואפילו העתק של התגובות שהשרת מחזיר לך אולי נהיה קצת יותר חכמים.

GNS 08-09-12 14:34

זה הקוד שאני משתמש בו:

קוד:

<?php
$filename=....
$file_url=.....

header("Pragma: public");
header("Expires: 0");
header("Content-disposition: attachment; filename=\"".$filename."\"");
header("Connection: close");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/octet-stream");
header("Content-Description: File Transfer" );
header("Content-Transfer-Encoding: Binary");
header("Accept-Ranges: none");
header("X-Sendfile: ".$file_url);

?>


בhttpd.conf מוגדר:
XSendFileIgnoreEtag on

ותוצאות השליחה:
קוד:

Array ( [wrapper_data] => Array ( [0] => HTTP/1.1 200 OK [1] => Date: Sat, 08 Sep 2012 12:27:48 GMT [2] => Server: Apache/2.2.3 (CentOS) [3] => X-Powered-By: PHP/5.3.3 [4] => Pragma: public [5] => Expires: 0 [6] => Content-disposition: attachment; filename="[the filename]" [7] => Connection: close [8] => Cache-Control: must-revalidate, post-check=0, pre-check=0 [9] => Cache-Control: private [10] => Content-Description: File Transfer [11] => Content-Transfer-Encoding: Binary [12] => Accept-Ranges: none [13] => X-Powered-By: PleskLin [14] => Last-Modified: Wed, 04 Jul 2012 22:45:13 GMT [15] => ETag: "3c08018-4f5d5d-4c408c8b61040" [16] => Content-Length: 5201245 [17] => Content-Type: application/octet-stream ) [wrapper_type] => http [stream_type] => tcp_socket/ssl [mode] => r [unread_bytes] => 7584 [seekable] => [uri] => [the url]
כדי לבדוק שלא מדובר במטמון מהדפדפן שלי, השתמשתי בכמה דפדפנים שונים ואפילו במחשב שונה ועדיין זה מוריד קובץ אחר בכלל.

אדיר 08-09-12 14:55

הנתונים שמוזנים לסקריפט (file_url, filename) תואמים לנתונים שהשרת שולח לך בתגובה?
האם מדובר בקבצים קבועים שנשלחים כקבצים אחרים או שזה משתנה ואתה לא מזהה איזשהי תבנית קבועה?

על פניו הקוד נראה בסדר, אולי יש איזשהי בעיה לוגית בהצבת הערכים של המשתנים שגורמת לשליחת קבצים אחרים.
תעשה קצת דיבאגינג לקוד ותנסה לאתר את הבעיה, יהיה מאוד קשה (עד בלתי אפשרי) לעזור לך בלי גישה למערכת.

GNS 08-09-12 17:28

filename תואם, file_url זה הקובץ php שממנו הx-sendfile יוצא והוא בסדר.
לא מצאתי תבנית.

שיניתי לreadfile במקום x-sendfile והקובץ הנכון ירד, כך שזה בוודאות הx-sendfile.

יש רעיון / כיוון?

אדיר 08-09-12 17:34

מזאת אומרת: "file_url זה הקובץ php שממנו הx-sendfile יוצא"?

filename אמור להכיל את השם של הקובץ,
file_url אמור להכיל את המיקום של הקובץ.

GNS 08-09-12 17:58

חלק מהיתרון של x-sendfile זה שלא יודעים את מיקום הקובץ..

מה שיש בfile_url זה הdownload.php

GNS 08-09-12 18:01

אחרי שהחזרתי מreadfile לx-sendfile זה הסתדר אבל אני די בטוח שזה יקרה שוב וקשה לנטר את זה.

אדיר 08-09-12 18:06

כשאתה אומר "לא יודעים את המיקום של הקובץ" למי אתה מתכוון?
כמובן שהגולשים לא ידעו את המיקום של הקובץ, הכותר x-sendfile לא מגיע אליהם.

אם אתה מעביר את הקובץ באמצעות download.php ושם אתה קורא אותו עם readfile (או משהו בסגנון) אני לא רואה איך אתה מרוויח מ- x-sendfile,
הרי בסופו של דבר הקובץ אצלך עדיין נשלח באמצעות ה- php.

file_url אמור להכיל את הנתיב המלא לקובץ, ואז המודול משדר אותו לגולש בשם שהגדרת ב- content-disposition.

GNS 08-09-12 18:24

בreadfile השתמשתי בתור ניסוי וזה עבד טוב.
x-sendfile עושה את הבעיות.

אני כנראה פשוט אחפור בגוגל מה הקטע של המטמון בx-sendfile או שאחפש שיטה אחרת להוריד.

אדיר 08-09-12 18:32

לפי מה שאתה מתאר עושה רושם שאין שום בעיה עם המטמון.

file_url אמור להכיל את הנתיב המלא לקובץ, זה למעשה הקובץ שהמודול משדר.
אם אתה מזין בו ערך אחר, זאת הבעיה.

GNS 08-09-12 18:45

אני כן מזין בו את הנתיב המלא של הקובץ אבל בתגובת השרת הוא לא מחזיר את הנתיב הזה אלא את הנתיב של הקובץ PHP שממנו זה יצא (וזה בסדר גמור).

GNS 08-09-12 18:48

פעם הבאה שזה יקרה אני אנסה להוריד את הETAG:

קוד:

Header unset ETag
FileETag None

הבעיה שקשה מאד לנטר את התקלה הזאת..

Kernel 08-09-12 19:25

מה הקשר ל-ETag?
Apache/nginx לא מתייחס ל-ETag ב-x-sendfile,
הדפדפן של הגולש מתייחס ל-ETag (בהנחה שהוא הוריד בעבר את הקובץ, Etag דורס Cache-control ו-Expires),
הרוב לא ממליצים להשתמש ב-ETag, כי Cache-control עושה את העבודה בהנחה שלא מדובר ביותר משרת אחד.

GNS 08-09-12 19:27

הבנתי, טעות שלי..

יש לך רעיון מה יכול לעזור?

Kernel 08-09-12 19:34

נתחיל מ:
קובץ הקונפיג של אפצ'י.
הסקריפט המלא.
ה-PATH המלא של הקובץ.


כל הזמנים הם GMT +2. הזמן כעת הוא 19:05.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ