开发者

Rewrite pagerequests to index.php, filerequests to app/webroot directory

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_FILENA开发者_Python百科ME} !-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:

RewriteEngine On

# These two lines are very specific to your current setup, to prevent
# mod_dir from doing what it does, but in a more controlled way
RewriteCond %{THE_REQUEST} ^[A-Z]+\s/iceberg[^/]
RewriteRule .* http://localhost/iceberg/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI}      !^/app/webroot
RewriteCond %{REQUEST_URI}       \.[a-z]+$ [NC]
RewriteRule ^.*$ app/webroot/$0 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI}      !^/app/webroot
RewriteRule ^.*$ index.php?route=$0 [QSA,L]

Also, to explain, the reason why you are getting the 500 error is likely because of your rule:

RewriteRule ^(.*)$ index.php?route=$1 [QSA,L]

Since it's unconditional, and the regular expression pattern will always match, your rewrite will be performed over and over (the L flag doesn't prevent this, because after you rewrite to index.php, an internal redirection is made inside of Apache, and the process loses its current state).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜