页面请求看起来像/ 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。
目录结构
由于你可以通过文件扩展名/ 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错误。
非常感谢任何帮助! =)
答案 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内部进行,并且该进程失去其当前状态。)