Mailing List Archive

Need help rewriting non-existent URLs
Hi everyone,
I'm trying to move one of my sites from Apache to Cherokee. I've nearly
got it working but I'm stuck on one of the rewrite rules. The directory
js/combined has a .htaccess file containing:

ExpiresActive on
ExpiresDefault "access plus 1 month"

RewriteEngine on

# Rewrite non-existent URLs to the combiner, to create a new combined file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (\d+).js combine.php?set=site&v=$1 [L]

I use this for "lazy JavaScript minification". Basically, when a user hits
/js/combined/123.js and 123.js doesn't exist yet, it goes through the
combine.php script. The combine.php script combines and minifies all the
JavaScript files used by the site, outputs them to the correct file name
(123.js) and then serves the file itself. After this is done, every user
gets the file directly (as it now exists). I've got a deployment script
that deploys the site and increments the "version number" used in the JS
URLs. it seems to be working quite well on Apache.

However, on Cherokee I can't get it working. I've tried the following rules:
1. Extension php - FastCGI, Non-final, cache turned off
2. Directory /js/combined AND File Exists - List & Send, gzip, IO cache
turned off (for debugging), Final
3. Directory /js/combined - Rewrite, Final
- Internal, (\d+).js$ to /js/combined/combine.php?set=site&v=$1

In theory the "file exists" rule should serve the existing files, as it's
marked as "final". However this isn't happening and every request is going
through the combine.php script.

I've tried the following rules with the same result:
1. Extension php - FastCGI, Non-final, cache turned off
2. Directory /js/combined AND NOT File Exists - Rewrite, Final, IO cache
turned off (for debugging)
- Internal, (\d+).js$ to /js/combined/combine.php?set=site&v=$1
3. Directory /js/combined - List & Send, gzip, Final

In this case, every file still seems to be going through the combine.php
script as well!? In either scenario, turning off the rewrite serves
existing files correctly, but obviously non-existent URLs don't work.

tl,dr: I want to rewrite a URL in a directory only when the file doesn't
exist, but am having issues with that.

Any suggestions?

--
Regards,
Daniel Lo Nigro
http://dan.cx/ | http://twitter.com/Daniel15
Re: Need help rewriting non-existent URLs [ In reply to ]
I seem to have fixed it by rearranging the rules as:

1. File exists without Directory rule (used to be the default handler),
Final
2. Redirect rule for non-existent files
3. Change default rule to HTTP error (404)

Do "File exists" rules not work when combined via AND with "Directory"
rules?

On Sat, Feb 11, 2012 at 9:08 PM, Daniel Lo Nigro <lists@dan.cx> wrote:

> Hi everyone,
> I'm trying to move one of my sites from Apache to Cherokee. I've nearly
> got it working but I'm stuck on one of the rewrite rules. The directory
> js/combined has a .htaccess file containing:
>
> ExpiresActive on
> ExpiresDefault "access plus 1 month"
>
> RewriteEngine on
>
> # Rewrite non-existent URLs to the combiner, to create a new combined file
> RewriteCond %{REQUEST_FILENAME} !-f
> RewriteCond %{REQUEST_FILENAME} !-d
> RewriteRule (\d+).js combine.php?set=site&v=$1 [L]
>
> I use this for "lazy JavaScript minification". Basically, when a user hits
> /js/combined/123.js and 123.js doesn't exist yet, it goes through the
> combine.php script. The combine.php script combines and minifies all the
> JavaScript files used by the site, outputs them to the correct file name
> (123.js) and then serves the file itself. After this is done, every user
> gets the file directly (as it now exists). I've got a deployment script
> that deploys the site and increments the "version number" used in the JS
> URLs. it seems to be working quite well on Apache.
>
> However, on Cherokee I can't get it working. I've tried the following
> rules:
> 1. Extension php - FastCGI, Non-final, cache turned off
> 2. Directory /js/combined AND File Exists - List & Send, gzip, IO cache
> turned off (for debugging), Final
> 3. Directory /js/combined - Rewrite, Final
> - Internal, (\d+).js$ to /js/combined/combine.php?set=site&v=$1
>
> In theory the "file exists" rule should serve the existing files, as it's
> marked as "final". However this isn't happening and every request is going
> through the combine.php script.
>
> I've tried the following rules with the same result:
> 1. Extension php - FastCGI, Non-final, cache turned off
> 2. Directory /js/combined AND NOT File Exists - Rewrite, Final, IO cache
> turned off (for debugging)
> - Internal, (\d+).js$ to /js/combined/combine.php?set=site&v=$1
> 3. Directory /js/combined - List & Send, gzip, Final
>
> In this case, every file still seems to be going through the combine.php
> script as well!? In either scenario, turning off the rewrite serves
> existing files correctly, but obviously non-existent URLs don't work.
>
> tl,dr: I want to rewrite a URL in a directory only when the file doesn't
> exist, but am having issues with that.
>
> Any suggestions?
>
> --
> Regards,
> Daniel Lo Nigro
> http://dan.cx/ | http://twitter.com/Daniel15
>