将pagerequests重写为index.php,将filerequests重写为app / webroot目录

时间:2010-07-10 11:09:47

标签: php mod-rewrite

嘿,我一直在阅读StackOverflow.com很长一段时间,但决定报名参加提问。我正在编写自己的轻量级MVC框架,用于在index.php中路由页面请求。

页面请求看起来像/ controller / action / arg1 / arg2 / arg3,它们应该重写为index.php?route = [request]。那么,像site.com这样的[request]应该重写为index.php?route = user / profile / 123

但是,文件并不意味着要重写为index.php。图像和样式表等资产位于/ app / webroot /文件夹中,不需要执行PHP。因此,mod_rewrite引擎应该将任何文件请求重写到/ app / webroot /,并在文件不存在时提供配置的404 ErrorDocument。

目录结构

  • ./的index.php
  • ./应用程序/根目录/脚本/助手/ hamster.js
  • ./应用程序/根目录/图像/ logo.png
  • ./应用程序/根目录/风格/ main.css的

由于你可以通过文件扩展名/ dot的存在来区分文件请求(/squirrel.png)和页面请求(/ user / profile / 123)之间的区别,我原以为这会是真的简单。但是......我真的很难过,我希望有人可以帮助我。

我尝试过的东西是......

  

RewriteEngine On

     

RewriteCond%{REQUEST_FILENAME}!-f

     

RewriteCond%{REQUEST_FILENAME}!-d

     

RewriteRule ^(。*)$ app / webroot / $ 1 [L]

     

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

...但除了正确地重定向到现有文件之外,它并没有真正起作用。 Pagerequests或不存在的文件会导致HTTP 500错误。

非常感谢任何帮助! =)

1 个答案:

答案 0 :(得分:0)

看看这是否与预期的一样:

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]

此外,要解释一下,您收到500错误的原因很可能是因为您的规则:

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

由于它是无条件的,并且正则表达式模式将始终匹配,因此您的重写将一遍又一遍地执行(L标志不会阻止此操作,因为在您重写为index.php之后,内部重定向在Apache内部进行,并且该进程失去其当前状态。)