Hey, I’ve been reading StackOverflow.com for a long time but decided to sign up to ask a question. I’m writing my own lightweight MVC framework that routes page requests in index.php.
Page requests look like /controller/action/arg1/arg2/arg3, and they should be rewritten to index.php?route=[request]. So, a [request] like site.com/user/profile/123 should be rewritten to index.php?route=user/profile/123
However, files aren’t meant to rewrite to index.php. Assets such as images and stylesheets are in the /app/webroot/ folder, and don’t need PHP to be executed. So, the mod_rewrite engine should rewrite any filerequests to /app/webroot/, and serve the configured 404 ErrorDocument when the file doesn’t exist.
Directory structure
- ./index.php
- ./app/webroot/scripts/helpers/hamster.js
- ./app/webroot/images/logo.png
- ./app/webroot/style/main.css
Since you can tell the difference between a file request (/squirrel.png) and a page request (/user/profile/123) just by the existence of the file extension / dot, I was expecting that this would be really easy. But… I’m having a really hard time with it and I was hoping someone could help me out.
Something I’ve tried was…
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ app/webroot/$1 [L]
RewriteRule ^(.*)$ index.php?route=$1 [QSA,L]
… but it doesn’t really work except for redirecting correctly to existing files. Pagerequests or nonexisting files result in HTTP 500 errors.
Any help is greatly appreciated! =)
See if this works out a little more like you expected:
Also, to explain, the reason why you are getting the 500 error is likely because of your rule:
Since it’s unconditional, and the regular expression pattern will always match, your rewrite will be performed over and over (the
Lflag doesn’t prevent this, because after you rewrite toindex.php, an internal redirection is made inside of Apache, and the process loses its current state).