views:

91

answers:

2

This is my htaccess file

RewriteBase /

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

RewriteCond %{REQUEST_URI} !^/chat/
RewriteCond %{REQUEST_URI} !^/m/
RewriteCond %{REQUEST_URI} !^/__admin/
RewriteCond %{REQUEST_URI} !^/gzip_headers.php
RewriteCond %{REQUEST_URI} !^/phpfreechat/
RewriteCond %{REQUEST_URI} !^/_temp/


RewriteRule ^.+\.php$ index.php [L]

RewriteRule ^.*\.css gzip_headers.php [L]
RewriteRule ^.*\.js gzip_headers.php [L]

RewriteRule ^classifieds/ /index.php [L]

RewriteCond %{REQUEST_URI} !^/movies/.
RewriteRule ^movies/ /index.php [L]

RewriteCond %{REQUEST_URI} !^/games/.
RewriteRule ^games/ /index.php [L]

RewriteRule ^jntu/ /index.php [L]
RewriteRule ^news/ /index.php [L]

My idea behind this basically is,

  • forward everything to public_html/index.php (except some directories)
  • forward all js and css to gzip file, ( i am doing this basically because im not jsut gzipping them but also compressing in tha phpfile)
  • the problem is when I load images from subdirectories the are redirected to index.php as well, so just creating conditions for those directories and storing images in them like RewriteCond %{REQUEST_URI} !^/games/.

I would like to make it simple to do stuff like this

  • forward everything to index.php (except some conditions on top)
  • forward css and js to gzip file
  • load images and flash and some other mime types straight away only if they exists. (jpg|gif|png|swf|flv|mp4|3gp|mp3|zip|rar|exe)

Something like logical AND REQUEST_URI and -f flag I guess

A: 

I'm not sure why your images are being redirected if your rule only redirects URIs ending with '.php'. That should exclude all other file extensions from the rule.

I'm also not sure what you mean by needing 'logical and'. When you have a number of RewriteCond lines before a RewriteRule those conditions are ANDed together and the rule is only applied if they all are true.

You can't use modrewrite to check for the existance of files and say "if the file exists, don't apply any rules, just serve up the file".

I think the best solution would be to either use a single top-level directory called 'static' or 'images' where you put all your files and exclude it from the rules, or have a wider-matching rule.

So for example you could make 'static' or 'images' a special directory name and exclude any url that contains .*/images/.* from the rules. Then /something/images/image.jpg and /something/else/images/image.jpg would both be excluded and the file would be served up.

Another hacky way would be to serve the files up from PHP. So in PHP you would translate $_SERVER['REQUEST_URI'] into a filename and see if it exists. If it does, you can write the file contents to the PHP output stream, although this won't be as efficient as leaving it up to Apache, and actually I really would not recommend it.

But like I said before, if your rule is only matching files that end with .php then your images should not be getting redirected. I would figure out why this is happening first. There is a way to turn on debug logging for mod_rewrite but you'll have to Google that.

Mike Weller
Hi, the images arent being displayed because the rewrite rule for php is being overridden by theseRewriteCond %{REQUEST_URI} !^/games/.RewriteRule ^games/ /index.php [L]
atif089
A: 

Try these rules:

RewriteCond %{HTTP_HOST} =example.com [NC]
RewriteRule ^ http://www.example.com%{REQUEST_URI} [L,R=301]

RewriteRule .*\.(js|css)$ gzip_headers.php [L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .+\.(jpg|gif|png|swf|flv|mp4|3gp|mp3|zip|rar|exe)$ - [L]

RewriteCond %{REQUEST_URI} !^/(gzip_headers|index)\.php$
RewriteCond %{REQUEST_URI} !^/(chat|m|__admin|phpfreechat|_temp)/
RewriteRule ^.+\.php$ index.php [L]
Gumbo
This was awesome :) exactly what I was looking for,, I added this at the end and hope it is correct`RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_URI} ^/(movies|games|jntu|news|classifieds)/RewriteRule ^. /index.php [L]`
atif089