On March 26, 2019 we launched new MODX Forums. Please join us at the new MODX Community Forums.
Subscribe: RSS
  • Hi Everyone,

    I've recently been optimising a ModX(2.3.3) site following recommendations from Google insights.

    I added the following code to the htaccess file to leverage the browser cache:

    # BEGIN Caching
    <ifModule mod_headers.c>
    <filesMatch "\\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">
    Header set Cache-Control "max-age=2592000, public"
    </filesMatch>
    <filesMatch "\\.(css)$">
    Header set Cache-Control "max-age=604800, public"
    </filesMatch>
    <filesMatch "\\.(js)$">
    Header set Cache-Control "max-age=216000, private"
    </filesMatch>
    <filesMatch "\\.(xml|txt)$">
    Header set Cache-Control "max-age=216000, public, must-revalidate"
    </filesMatch>
    <filesMatch "\\.(html|htm|php)$">
    Header set Cache-Control "max-age=1, private, must-revalidate"
    </filesMatch>
    </ifModule>
    # END Caching

    This had the desired effect on my Google insight score. It took the score from 67/100 up to 90/100.

    However since implementing this code ModX has been misbehaving. We constantly get an error message when trying to save anything in the admin. The error code simply reads Error 200. I also notice when saving a resource the changes appear on the front-end but aren't reflected in the admin.

    Obviously this code is messing around with ModX's cache system.

    Can someone recommend the correct code for leveraging the browser cache for ModX.

    Thank you in advance.
    • I add the following to the bottom of all MODX .htaccess files:

      <IfModule mod_mime.c>
          AddType text/css .css
          AddType text/x-component .htc
          AddType application/x-javascript .js
          AddType application/javascript .js2
          AddType text/javascript .js3
          AddType text/x-js .js4
          AddType text/html .html .htm
          AddType text/richtext .rtf .rtx
          AddType image/svg+xml .svg .svgz
          AddType text/plain .txt
          AddType text/xsd .xsd
          AddType text/xsl .xsl
          AddType text/xml .xml
          AddType video/asf .asf .asx .wax .wmv .wmx
          AddType video/avi .avi
          AddType image/bmp .bmp
          AddType application/java .class
          AddType video/divx .divx
          AddType application/msword .doc .docx
          AddType application/vnd.ms-fontobject .eot
          AddType application/x-msdownload .exe
          AddType image/gif .gif
          AddType application/x-gzip .gz .gzip
          AddType image/x-icon .ico
          AddType image/jpeg .jpg .jpeg .jpe
          AddType application/json .json
          AddType application/vnd.ms-access .mdb
          AddType audio/midi .mid .midi
          AddType video/quicktime .mov .qt
          AddType audio/mpeg .mp3 .m4a
          AddType video/mp4 .mp4 .m4v
          AddType video/mpeg .mpeg .mpg .mpe
          AddType application/vnd.ms-project .mpp
          AddType application/x-font-otf .otf
          AddType application/vnd.oasis.opendocument.database .odb
          AddType application/vnd.oasis.opendocument.chart .odc
          AddType application/vnd.oasis.opendocument.formula .odf
          AddType application/vnd.oasis.opendocument.graphics .odg
          AddType application/vnd.oasis.opendocument.presentation .odp
          AddType application/vnd.oasis.opendocument.spreadsheet .ods
          AddType application/vnd.oasis.opendocument.text .odt
          AddType audio/ogg .ogg
          AddType application/pdf .pdf
          AddType image/png .png
          AddType application/vnd.ms-powerpoint .pot .pps .ppt .pptx
          AddType audio/x-realaudio .ra .ram
          AddType application/x-shockwave-flash .swf
          AddType application/x-tar .tar
          AddType image/tiff .tif .tiff
          AddType application/x-font-ttf .ttf .ttc
          AddType audio/wav .wav
          AddType audio/wma .wma
          AddType application/vnd.ms-write .wri
          AddType application/vnd.ms-excel .xla .xls .xlsx .xlt .xlw
          AddType application/zip .zip
      </IfModule>
      <IfModule mod_expires.c>
          ExpiresActive On
          ExpiresByType text/css A31536000
          ExpiresByType text/x-component A31536000
          ExpiresByType application/x-javascript A31536000
          ExpiresByType application/javascript A31536000
          ExpiresByType text/javascript A31536000
          ExpiresByType text/x-js A31536000
          ExpiresByType text/html A3600
          ExpiresByType text/richtext A3600
          ExpiresByType image/svg+xml A3600
          ExpiresByType text/plain A3600
          ExpiresByType text/xsd A3600
          ExpiresByType text/xsl A3600
          ExpiresByType text/xml A3600
          ExpiresByType video/asf A31536000
          ExpiresByType video/avi A31536000
          ExpiresByType image/bmp A31536000
          ExpiresByType application/java A31536000
          ExpiresByType video/divx A31536000
          ExpiresByType application/msword A31536000
          ExpiresByType application/vnd.ms-fontobject A31536000
          ExpiresByType application/x-msdownload A31536000
          ExpiresByType image/gif A31536000
          ExpiresByType application/x-gzip A31536000
          ExpiresByType image/x-icon A31536000
          ExpiresByType image/jpeg A31536000
          ExpiresByType application/json A31536000
          ExpiresByType application/vnd.ms-access A31536000
          ExpiresByType audio/midi A31536000
          ExpiresByType video/quicktime A31536000
          ExpiresByType audio/mpeg A31536000
          ExpiresByType video/mp4 A31536000
          ExpiresByType video/mpeg A31536000
          ExpiresByType application/vnd.ms-project A31536000
          ExpiresByType application/x-font-otf A31536000
          ExpiresByType application/vnd.oasis.opendocument.database A31536000
          ExpiresByType application/vnd.oasis.opendocument.chart A31536000
          ExpiresByType application/vnd.oasis.opendocument.formula A31536000
          ExpiresByType application/vnd.oasis.opendocument.graphics A31536000
          ExpiresByType application/vnd.oasis.opendocument.presentation A31536000
          ExpiresByType application/vnd.oasis.opendocument.spreadsheet A31536000
          ExpiresByType application/vnd.oasis.opendocument.text A31536000
          ExpiresByType audio/ogg A31536000
          ExpiresByType application/pdf A31536000
          ExpiresByType image/png A31536000
          ExpiresByType application/vnd.ms-powerpoint A31536000
          ExpiresByType audio/x-realaudio A31536000
          ExpiresByType image/svg+xml A31536000
          ExpiresByType application/x-shockwave-flash A31536000
          ExpiresByType application/x-tar A31536000
          ExpiresByType image/tiff A31536000
          ExpiresByType application/x-font-ttf A31536000
          ExpiresByType audio/wav A31536000
          ExpiresByType audio/wma A31536000
          ExpiresByType application/vnd.ms-write A31536000
          ExpiresByType application/vnd.ms-excel A31536000
          ExpiresByType application/zip A31536000
      </IfModule>
      <IfModule mod_deflate.c>
          <IfModule mod_headers.c>
              Header append Vary User-Agent env=!dont-vary
          </IfModule>
              AddOutputFilterByType DEFLATE text/css text/x-component application/x-javascript application/javascript text/javascript text/x-js text/html text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon application/json
          <IfModule mod_mime.c>
              # DEFLATE by extension
              AddOutputFilter DEFLATE js css htm html xml
          </IfModule>
      </IfModule>
      <FilesMatch "\.(css|htc|js|js2|js3|js4|CSS|HTC|JS|JS2|JS3|JS4)$">
          FileETag MTime Size
          <IfModule mod_headers.c>
              Header set Pragma "public"
              Header append Cache-Control "public, must-revalidate, proxy-revalidate"
          </IfModule>
      </FilesMatch>
      <FilesMatch "\.(html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|HTML|HTM|RTF|RTX|SVG|SVGZ|TXT|XSD|XSL|XML)$">
          FileETag MTime Size
          <IfModule mod_headers.c>
              Header set Pragma "public"
              Header append Cache-Control "public, must-revalidate, proxy-revalidate"
          </IfModule>
      </FilesMatch>
      <FilesMatch "\.(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|json|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|otf|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|tif|tiff|ttf|ttc|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip|ASF|ASX|WAX|WMV|WMX|AVI|BMP|CLASS|DIVX|DOC|DOCX|EOT|EXE|GIF|GZ|GZIP|ICO|JPG|JPEG|JPE|JSON|MDB|MID|MIDI|MOV|QT|MP3|M4A|MP4|M4V|MPEG|MPG|MPE|MPP|OTF|ODB|ODC|ODF|ODG|ODP|ODS|ODT|OGG|PDF|PNG|POT|PPS|PPT|PPTX|RA|RAM|SVG|SVGZ|SWF|TAR|TIF|TIFF|TTF|TTC|WAV|WMA|WRI|XLA|XLS|XLSX|XLT|XLW|ZIP)$">
          FileETag MTime Size
          <IfModule mod_headers.c>
              Header set Pragma "public"
              Header append Cache-Control "public, must-revalidate, proxy-revalidate"
          </IfModule>
      </FilesMatch>
      
      <IfModule filter_module>
          FilterDeclare   COMPRESS
          FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/html
          FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/css
          FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/plain
          FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/xml
          FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/x-component
          FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/javascript
          FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/json
          FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/xml
          FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/xhtml+xml
          FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/rss+xml
          FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/atom+xml
          FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/vnd.ms-fontobject
          FilterProvider  COMPRESS  DEFLATE resp=Content-Type $image/svg+xml
          FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/x-font-ttf
          FilterProvider  COMPRESS  DEFLATE resp=Content-Type $font/opentype
          FilterChain     COMPRESS
          FilterProtocol  COMPRESS  DEFLATE change=yes;byteranges=no
        </IfModule>
      
      
      
      
      #Gzip
      <ifmodule mod_deflate.c>
      AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript text/javascript
      </ifmodule>
      #End Gzip
      
      
      <ifModule mod_gzip.c>
      mod_gzip_on Yes
      mod_gzip_dechunk Yes
      mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
      mod_gzip_item_include handler ^cgi-script$
      mod_gzip_item_include mime ^text/.*
      mod_gzip_item_include mime ^application/x-javascript.*
      mod_gzip_item_exclude mime ^image/.*
      mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
      </ifModule>
      
      AddOutputFilterByType DEFLATE text/plain
      AddOutputFilterByType DEFLATE text/html
      AddOutputFilterByType DEFLATE text/xml
      AddOutputFilterByType DEFLATE text/css
      AddOutputFilterByType DEFLATE application/xml
      AddOutputFilterByType DEFLATE application/xhtml+xml
      AddOutputFilterByType DEFLATE application/rss+xml
      AddOutputFilterByType DEFLATE application/javascript
      AddOutputFilterByType DEFLATE application/x-javascript
      • Hi Paul,

        Thank you so much for you reply. I added the above code to the htaccess file and at first I received an internal server error page. I worked out the following IFModule was causing this:

        <IfModule filter_module>
        FilterDeclare COMPRESS
        FilterProvider COMPRESS DEFLATE resp=Content-Type $text/html
        FilterProvider COMPRESS DEFLATE resp=Content-Type $text/css
        FilterProvider COMPRESS DEFLATE resp=Content-Type $text/plain
        FilterProvider COMPRESS DEFLATE resp=Content-Type $text/xml
        FilterProvider COMPRESS DEFLATE resp=Content-Type $text/x-component
        FilterProvider COMPRESS DEFLATE resp=Content-Type $application/javascript
        FilterProvider COMPRESS DEFLATE resp=Content-Type $application/json
        FilterProvider COMPRESS DEFLATE resp=Content-Type $application/xml
        FilterProvider COMPRESS DEFLATE resp=Content-Type $application/xhtml+xml
        FilterProvider COMPRESS DEFLATE resp=Content-Type $application/rss+xml
        FilterProvider COMPRESS DEFLATE resp=Content-Type $application/atom+xml
        FilterProvider COMPRESS DEFLATE resp=Content-Type $application/vnd.ms-fontobject
        FilterProvider COMPRESS DEFLATE resp=Content-Type $image/svg+xml
        FilterProvider COMPRESS DEFLATE resp=Content-Type $application/x-font-ttf
        FilterProvider COMPRESS DEFLATE resp=Content-Type $font/opentype
        FilterChain COMPRESS
        FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no
        </IfModule>

        I removed it and everything seems to be good!

        Thank you again for your help.
        • To enable leverage browser caching you have to update your htaccess file

          <IfModule mod_expires.c>
          ExpiresActive On
          ExpiresByType image/jpg "access 1 year"
          ExpiresByType image/jpeg "access 1 year"
          ExpiresByType image/gif "access 1 year"
          ExpiresByType image/png "access 1 year"
          ExpiresByType text/css "access 1 month"
          ExpiresByType application/pdf "access 1 month"
          ExpiresByType application/x-javascript "access 1 month"
          ExpiresByType application/x-shockwave-flash "access 1 month"
          ExpiresByType image/x-icon "access 1 year"
          ExpiresDefault "access 2 days"
          </IfModule>

          Source: http://webdeveloperbareilly.in/blog/seo/leverage-browser-caching.html
          • We do similar to Mdashrafmalik. It's never caused any problems and has had the desired effect. Gzip compression is also a good addition to the .htaccess if your server supports it.