Search code examples
php.htaccessfile-exists

Using htaccess to check file in another directory


Ok, I am starting to wonder if this is even possible. I have been pouring over htaccess tutorials and examples and I just can't seem to get it working right.

I have a script that creates dynamic images running in a directory on a friends website. I have access to / but the actual directory I am using is in /mydir/. In order to display the images they are output to png via PHP. I have the following RewriteRule setup to take the filename requested and run a PHP script. Each filename represents a separate file with a serialized object used in the display.php script

RewriteRule ^(.*)\.jpg$ display.php?file=$1

That part is working fine, however if someone requests a file that doesn't exist it just throws PHP errors because the script gets called but there is no object for it to use.

What I am trying to do now, and utterly failing at, is to have it check if the file exists in ./Cache/ directory then run the script as usual and if not then the server can just throw a standard 404.

I have tried things like

RewriteCond %{REQUEST_URI} ^(.*)\.jpg$
RewriteCond %{DOCUMENT ROOT}/img/Cache/%1.jpg -f

and other combinations of REQUEST_URI, REQUEST_URL, SCRIPT_FILENAME, SCRIPT_NAME, etc. I can't seem to come up with the proper variable and regex expression to handle this so I am turning to you guys for help. The biggest problem is not knowing what is actually in each of those variables so I can see where I am going wrong. I would kill for some kind of var_dump(),


Solution

  • Use this rule:

    Options +FollowSymLinks
    RewriteEngine On
    
    RewriteCond %{DOCUMENT_ROOT}/mydir/img/Cache/$1.jpg -f
    RewriteRule ^(.*)\.jpg$ display.php?file=$1 [L]
    
    1. This needs to be placed into .htaccess file in /mydir/img folder

    2. If you move this folder somewhere else or rename parent folder, you will need update it as well in RewriteCond line.


    If you wish you can try this approach, which is more flexible (no need to specify parent folder names) but I cannot guarantee that this will work on your setup (but it DOES work on my PC):

    Options +FollowSymLinks
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} ^(.*)/([^/]+)\.jpg$
    RewriteCond %1/Cache/%2.jpg -f
    RewriteRule ^(.*)\.jpg display.php?file=$1 [L]
    

    Here the current physical folder is determined automatically from requested URL. But if you have symbolic links or some other settings, it may produce incorrect results. Plus .. it has 1 more Condition .. which makes it a bit slower (1 extra regex to check).