Оптимизация на .htaccess файла

След няколко седмично занимание с фина настройка на Prestashop системата и множество проблеми с SSL сертификати и модули, които карат страниците на магазина да показват несигурно съдържание, решихме да напишем статия по въпроса с оптимизацията на .htaccess файла за работа с Prestashop. Ще се радваме да чуем и вашето мнение и критика в коментарите към статията. Казусът е с стара версия на система, но принципът е общовалиден и за актуалната 1.6.х.

Prestashop: версия 1.4.9
Браузър: Chrome
Дизайн: тема, писана за проекта
Модули: CloudCache, Google Checkout

Редица модули и функции в PrestaShop изискват добре конфигуриран Apache сървър, а в повечето хостинг доставчици това не е така. Промяна файла .htaccess предлага работа около тези въпроси. Подобренията които направихме идват главно от добре написаният .htaccess файл от http://html5boilerplate.com/ и изменен, за нуждите на PrestaShop.

Важно уточнение! : Адресът на магазинът в примера е www.dressmeglam.com навсякъде където го виждате ще трябва да бъде променен, с URL-а на вашият магазин! За да приложите всички подобрения в този файл на вашия собствен просто добавете частта от кода, която Ви е нужна в своя .htaccess генератор във админ панела, така при всяко ре-генериране промените ще се запазват.

# .htaccess automaticaly generated by PrestaShop e-commerce open-source solution
# WARNING: PLEASE DO NOT MODIFY THIS FILE MANUALLY. IF NECESSARY, ADD YOUR SPECIFIC CONFIGURATION WITH THE HTACCESS GENERATOR IN BACK OFFICE
# http://www.prestashop.com - http://www.prestashop.com/forums
# ----------------------------------------------------------------------
# Start rewrite engine
# ----------------------------------------------------------------------
# Turning on the rewrite engine is necessary for the following rules and
# features. FollowSymLinks must be enabled for this to work.
# Some cloud hosting services require RewriteBase to be set: goo.gl/HOcPN
# If using the h5bp in a subdirectory, use `RewriteBase /foo` instead where
# 'foo' is your directory.
# If your web host doesn't allow the FollowSymlinks option, you may need to
# comment it out and use `Options +SymLinksOfOwnerMatch`, but be aware of the
# performance impact: http://goo.gl/Mluzd
<IfModule mod_rewrite.c>
  Options +FollowSymlinks
# Options +SymLinksIfOwnerMatch
  RewriteEngine On
# RewriteBase /
</IfModule>
# ----------------------------------------------------------------------
# force the "www." at the beginning of URLs or vise versa as long as your using one or the other only and not both! this is an SEO tweak
# ----------------------------------------------------------------------
RewriteCond %{HTTP_HOST} ^dressmeglam.com
RewriteRule ^(.*)$ http://www.dressmeglam.com/$1 [R=301,L]

# ----------------------------------------------------------------------
# Cross-domain AJAX requests
# ----------------------------------------------------------------------
# Serve cross-domain Ajax requests, disabled by default.
# enable-cors.org
# code.google.com/p/html5security/wiki/CrossOriginRequestSecurity
#  <IfModule mod_headers.c>
#	Header set Access-Control-Allow-Origin "*"
#  </IfModule>

# ----------------------------------------------------------------------
# CORS-enabled images (@crossorigin)
# ----------------------------------------------------------------------
# Send CORS headers if browsers request them; enabled by default for images.
# developer.mozilla.org/en/CORS_Enabled_Image
# blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html
# hacks.mozilla.org/2011/11/using-cors-to-load-webgl-textures-from-cross-domain-images/
# wiki.mozilla.org/Security/Reviews/crossoriginAttribute
<IfModule mod_setenvif.c>
  <IfModule mod_headers.c>
	# mod_headers, y u no match by Content-Type?!
	<FilesMatch ".(gif|png|jpe?g|svg|svgz|ico|webp)$">
	  SetEnvIf Origin ":" IS_CORS
	  Header set Access-Control-Allow-Origin "*" env=IS_CORS
	</FilesMatch>
  </IfModule>
</IfModule>

# ----------------------------------------------------------------------
# Webfont access
# ----------------------------------------------------------------------
# Allow access from all domains for webfonts.
# Alternatively you could only whitelist your
# subdomains like "subdomain.example.com".
<IfModule mod_headers.c>
  <FilesMatch ".(ttf|ttc|otf|eot|woff|font.css)$">
	Header set Access-Control-Allow-Origin "*"
  </FilesMatch>
</IfModule>

# ----------------------------------------------------------------------
# Proper MIME type for all files
# ----------------------------------------------------------------------
# JavaScript
#   Normalize to standard type (it's sniffed in IE anyways)
#   tools.ietf.org/html/rfc4329#section-7.2
AddType application/javascript		 js jsonp
AddType application/json			   json
# Audio
AddType audio/ogg					  oga ogg
AddType audio/mp4					  m4a f4a f4b
# Video
AddType video/ogg					  ogv
AddType video/mp4					  mp4 m4v f4v f4p
AddType video/webm					 webm
AddType video/x-flv					flv
# SVG
#   Required for svg webfonts on iPad
#   twitter.com/FontSquirrel/status/14855840545
AddType	 image/svg+xml			  svg svgz
AddEncoding gzip					   svgz
# Webfonts
AddType application/vnd.ms-fontobject  eot
AddType application/x-font-ttf		 ttf ttc
AddType font/opentype				  otf
AddType application/x-font-woff		woff
# Assorted types
AddType image/x-icon						ico
AddType image/webp						  webp
AddType text/cache-manifest				 appcache manifest
AddType text/x-component					htc
AddType application/xml					 rss atom xml rdf
AddType application/x-chrome-extension	  crx
AddType application/x-opera-extension	   oex
AddType application/x-xpinstall			 xpi
AddType application/octet-stream			safariextz
AddType application/x-web-app-manifest+json webapp
AddType text/x-vcard						vcf
AddType application/x-shockwave-flash	   swf
AddType text/vtt							vtt
# ----------------------------------------------------------------------
# Gzip compression if your server supports this
# ----------------------------------------------------------------------
<IfModule mod_deflate.c>
  # Force deflate for mangled headers developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping/
  <IfModule mod_setenvif.c>
	<IfModule mod_headers.c>
	  SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)s*,?s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
	  RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
	</IfModule>
  </IfModule>
  # Compress all output labeled with one of the following MIME-types
  <IfModule mod_filter.c>
	AddOutputFilterByType DEFLATE application/atom+xml
								  application/javascript
								  application/json
								  application/rss+xml
								  application/vnd.ms-fontobject
								  application/x-font-ttf
								  application/xhtml+xml
								  application/xml
								  font/opentype
								  image/svg+xml
								  image/x-icon
								  text/css
								  text/html
								  text/plain
								  text/x-component
								  text/xml
  </IfModule>
</IfModule>

# ----------------------------------------------------------------------
# Expires headers (for better cache control)
# ----------------------------------------------------------------------
# These are pretty far-future expires headers.
# They assume you control versioning with filename-based cache busting
# Additionally, consider that outdated proxies may miscache
#   www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/
# If you don't use filenames to version, lower the CSS and JS to something like
# "access plus 1 week".
<IfModule mod_expires.c>
  ExpiresActive on
# Perhaps better to whitelist expires rules? Perhaps.
  ExpiresDefault						  "access plus 1 month"
# cache.appcache needs re-requests in FF 3.6 (thanks Remy ~Introducing HTML5)
  ExpiresByType text/cache-manifest	   "access plus 0 seconds"
# Your document html
  ExpiresByType text/html				 "access plus 0 seconds"
# Data
  ExpiresByType text/xml				  "access plus 0 seconds"
  ExpiresByType application/xml		   "access plus 0 seconds"
  ExpiresByType application/json		  "access plus 0 seconds"
# Feed
  ExpiresByType application/rss+xml	   "access plus 1 hour"
  ExpiresByType application/atom+xml	  "access plus 1 hour"
# Favicon (cannot be renamed)
  ExpiresByType image/x-icon			  "access plus 1 week"
# Media: images, video, audio
  ExpiresByType image/gif				 "access plus 1 month"
  ExpiresByType image/png				 "access plus 1 month"
  ExpiresByType image/jpeg				"access plus 1 month"
  ExpiresByType video/ogg				 "access plus 1 month"
  ExpiresByType audio/ogg				 "access plus 1 month"
  ExpiresByType video/mp4				 "access plus 1 month"
  ExpiresByType video/webm				"access plus 1 month"
# HTC files  (css3pie)
  ExpiresByType text/x-component		  "access plus 1 month"
# Webfonts
  ExpiresByType application/x-font-ttf	"access plus 1 month"
  ExpiresByType font/opentype			 "access plus 1 month"
  ExpiresByType application/x-font-woff   "access plus 1 month"
  ExpiresByType image/svg+xml			 "access plus 1 month"
  ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
# CSS and JavaScript
  ExpiresByType text/css				  "access plus 1 year"
  ExpiresByType application/javascript	"access plus 1 year"
</IfModule>
# ----------------------------------------------------------------------
# ETag removal
# ----------------------------------------------------------------------
# FileETag None is not enough for every server.
<IfModule mod_headers.c>
  Header unset ETag
</IfModule>
# Since we're sending far-future expires, we don't need ETags for
# static content.
#   developer.yahoo.com/performance/rules.html#etags
FileETag None
# ----------------------------------------------------------------------
# UTF-8 encoding
# ----------------------------------------------------------------------
# Use UTF-8 encoding for anything served text/plain or text/html
AddDefaultCharset utf-8
# Force UTF-8 for a number of file formats
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml
<IfModule mod_rewrite.c>

– Добавките внасят подобрение в SEO като задават пренасочване на dressmeglam.com домейна към www.dressmeglam.com чрез 301 redirect

– Подобряват кеширането на сайта

– Подобряват скоростта на зареждане , чрез активиране на gzip, понеже сървърът го нямаше конфигурирано. (повечето хостинг доставчици не разрешават gzip за споделен хостинг и ще Ви приканят да ъпдейтнете към някакъв вид VPS, което ако цената Ви устройва не е лоша идея)