كيف يمكنني قبل ضغط الملفات مع mod_deflate في Apache 2.x ؟
-
09-06-2019 - |
سؤال
أنا في خدمة جميع المحتوى من خلال أباتشي مع Content-Encoding: zip
ولكن أن يضغط على الطاير.كمية جيدة من المحتوى هو ثابت الملفات على القرص.أريد أن gzip الملفات مسبقا بدلا من ضغط لهم في كل مرة يتم طلب.
هذا هو الشيء الذي أعتقد ، mod_gzip
هل في أباتشي 1.x تلقائيا ، ولكن مجرد وجود الملف .gz بجانبه.أن الأمر لم يعد كذلك مع mod_deflate
.
المحلول
هذه الوظيفة كان في غير محله في mod_gzip على أي حال.في Apache 2.x ، يمكنك أن تفعل ذلك مع المحتوى التفاوض.على وجه التحديد, تحتاج إلى تمكين MultiViews
مع Options
التوجيه و تحتاج إلى تحديد الترميز الخاص بك مع أنواع AddEncoding
التوجيه.
نصائح أخرى
للإجابة على سؤالي مع خط بسيط كنت في عداد المفقودين في confiuration:
Options FollowSymLinks MultiViews
كنت في عداد المفقودين مولتيفيوس الخيار.انها هناك في أوبونتو ويب الافتراضي ملقم التكوين ، حتى لا تكون مثلي وتسقطها.
كما كتبت سريعة الخليع المهمة ضغط جميع الملفات.
namespace :static do
desc "Gzip compress the static content so Apache doesn't need to do it on-the-fly."
task :compress do
puts "Gzipping js, html and css files."
Dir.glob("#{RAILS_ROOT}/public/**/*.{js,html,css}") do |file|
system "gzip -c -9 #{file} > #{file}.gz"
end
end
end
وأخشى مولتيفيوس لا تعمل كما هو متوقع:يقول الدكتور مولتيفيوس يعمل "إذا كان الملقم يتلقى طلب /بعض/dir/فو ، إذا /بعض/dir وقد مولتيفيوس تمكين و /بعض/dir/foo لا وجود لها...", وبعبارة أخرى:إذا كان لديك ملف foo.js و foo.js.gz في نفس الدليل, فقط تفعيل مولتيفيوس لن يسبب .gz الملف ليتم إرسالها حتى لو كان AcceptEncoding gzip رأس تنتقل عن طريق المتصفح (يمكنك التحقق من هذا السلوك عن طريق تعطيل مؤقتا mod_deflate ومراقبة الاستجابة مع مثلHTTPFox).
أنا لست متأكدا مما إذا كان هناك طريقة للتغلب على هذا مع مولتيفيوس (ربما يمكنك إعادة تسمية الملف الأصلي ثم قم بإضافة خاص AddEncoding التوجيه), ولكن أعتقد أنك يمكن بناء mod_rewrite القاعدة للتعامل مع هذا.
لدي اباتشي 2 بنيت من المصدر, و وجدت نفسي قد لتعديل التالية في بلدي httpd.conf ملف:
إضافة مولتيفيوس إلى خيارات:
Options Indexes FollowSymLinks MultiViews
Uncomment AddEncoding:
AddEncoding x-compress .Z AddEncoding x-gzip .gz .tgz
التعليق AddType:
#AddType application/x-compress .Z #AddType application/x-gzip .gz .tgz
فمن الممكن أن تخدم ما قبل ضغط الملفات باستخدام mod_negotiation
على الرغم من أنها قليلا صعب.الصعوبة الأساسية هي أن فقط طلبات الملفات التي لا توجد التفاوض.حتى إذا foo.js
و foo.js.gz
سواء وجود ردود /foo.js
سوف تكون دائما غير مضغوط (على الرغم من الردود /foo
سوف تعمل بشكل صحيح).
الحل الأسهل لقد وجدت (من فرانسوا Marier) هو إعادة تسمية ملفات مضغوطة مع ضعف امتداد الملف حتى foo.js
كما تنشر foo.js.js
حتى طلبات /foo.js
التفاوض بين foo.js.js
(أي ترميز) foo.js.gz
(gzip ترميز).
أنا الجمع بين تلك الحيلة مع التكوين التالي:
Options +MultiViews
RemoveType .gz
AddEncoding gzip .gz
# Send .tar.gz without Content-Encoding: gzip
<FilesMatch ".+\.tar\.gz$">
RemoveEncoding .gz
# Note: Can use application/x-gzip for backwards-compatibility
AddType application/gzip .gz
</FilesMatch>
أنا كتب آخر الذي يناقش المنطق لهذا التكوين و بعض البدائل في التفاصيل.
mod_gzip محتوى مضغوط على الطاير كذلك.يمكنك قبل ضغط الملفات من خلال تسجيل الدخول إلى الخادم الخاص بك, و ذلك من قذيفة.
cd /var/www/.../data/
for file in *; do
gzip -c $file > $file.gz;
done;
يمكنك استخدام mod_cache
إلى وكيل المحتوى المحلي في الذاكرة أو على القرص.أنا لا أعرف إذا كان هذا سوف تعمل كما هو متوقع مع mod_deflate
.
لدي الكثير من الكبيرة .ملفات json.معظم القراء في هذه الحالة.المعاينة إجابات لم تتحدث عن عاد "Content-type".
أنا كنت تريد التالية طلب العودة قبل ملف مضغوط مع "Content-Type:application/json" بشفافية استخدام Multiview مع ForceType
http://www.domain.com/(...)/bigfile.json
-> Content-Encoding:gzip, Content-Type: Content-Encoding:gzip
1) يجب أن تكون الملفات إعادة تسمية:"الملف.تحويلة.تحويلة"
2) Multiview يعمل كبيرة مع ForceType
في نظام الملفات:
// Note there is no bigfile.json
(...)/bigfile.json.gz
(...)/bigfile.json.json
في اباتشي التكوين:
<Directory (...)>
AddEncoding gzip .gz
Options +Multiviews
<Files *.json.gz>
ForceType application/json
</Files>
</Directory>
قصيرة وبسيطة :)