Wednesday, January 19, 2011

Apache2 - mod_expire and mod_rewrite not working in httpd.conf - serving content from tomcat

Hi,

I am using apache2 server running on debian which forwards all the http request to tomcat installed on same machine.

I have two files under my /etc/apache2/ folder

apache2.conf and httpd.conf

I modified httpd.conf file to look like following.


# forward all http request on port 80 to tomcat
ProxyPass / ajp://127.0.0.1:8009/
ProxyPassReverse / ajp://127.0.0.1:8009/

# gzip text content
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
DeflateCompressionLevel 9
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html


# Turn on Expires and mark all static content to expire in a week
# unset last modified and ETag 
ExpiresActive On
ExpiresDefault A0
<FilesMatch "\.(jpg|jpeg|png|gif|js|css|ico)$">
 ExpiresDefault A604800
 Header unset Last-Modified
 Header unset ETag
 FileETag None
 Header append Cache-Control "max-age=604800, public"
</FilesMatch>

RewriteEngine On

# rewrite all www.example.com/content/XXX-01.js and YYY-01.css files to XXX.js and YYY.css
RewriteRule ^content/(js|css)/([a-z]+)-([0-9]+)\.(js|css)$ /content/$1/$2.$4

# remove all query parameters from URL after we are done with it
RewriteCond %{THE_REQUEST} ^GET\ /.*\;.*\ HTTP/
RewriteCond %{QUERY_STRING} !^$
RewriteRule .* http://example.com%{REQUEST_URI}? [R=301,L]

# rewrite all www.example.com to example.com
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

I want to achieve following.

  1. forward all traffic to tomcat
  2. GZIP all the text content.
  3. Put 1 week expiry header to all static files and unset ETag/last modified header.
  4. rewrite all js and css file to certain format.
  5. remove all the query parameters from URL
  6. forward all www.example.com to example.com

The problem is only 1 and 2 are working. I tried a lot with many combinations but the expire and rewrite rule (3-6) do not work at all. I also tried moving these rules to apache2.conf and .htaccess files but it didn't work either. It does not give any error but these rules are simple ignored.

expires and rewrite modules are ENABLED.

Please let me know what should I do to fix this. 1. Do I need to add something else in httpd.conf file (like Options +FollowSymLink) or something else? 2. Do I need to add something in apache2.conf file? 3. Do I need to move these rules to .htaccess file? If yes, what should I write in that file and where should I keep that file? in /etc/apache2/ folder or /var/www/ folder? 4. Any other info to make this work?

Thanks, Ankit

  • hi,

    imo you should change the rules as following:

    #is the path correct? your comment stats something else
    RewriteRule ^/content/(js|css)/([a-z]+)-([0-9]+)\.(js|css) /content/$1/$2.$4
    
    # rewrite all www.example.com to example.com
    RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
    RewriteRule ^/(.*) http://example.com/$1 [R=301,L]
    

    to get more info, take a look at this directive and the following. after enabling logging try it all again and look at the logs.

    have you checked whether case of your regex and the case of your files match?

    From Christian

0 comments:

Post a Comment