我基本上想要将所有请求重定向到index.php并不重要,除了那些具有特定REQUEST_URI
的请求。那些看起来像图像文件的请求,应该检查如下结果:.jpg
或.png
,如果它们位于public/
文件夹(或任何深度的任何子文件夹)下,如果他们应该得到服务,重写过程应该停在这里!如果没有,我想重定向到public/errors/image-not-found.png
的默认图像并终止重写过程。其他例外是以.js, .css, .html
或.swf
结尾的文件。只有当它们位于public/
文件夹或任何其他子文件夹下时,才应该提供它们。如果没有,应该发回一个简单的404-Not found
。无论哪种情况,最后一次重写过程都需要停止。
任何其他请求都应重定向到index.php
并附加为query string
。 (即使请求指向的目录或文件不在上述条件下但存在,例如:www.xyz.com/library/Database.php
- > www.xyz.com/index.php?url=library/Database.php
)
我有半测量解决方案:
这就是我将所有内容重定向到index.php的方式:
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
答案 0 :(得分:0)
基本上,如果请求的文件存在于public/
或其任何子文件夹中,您就不想做任何事情。所以,首先我们处理这些问题:
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/public/.*\.(html|css|js|swf|jpe?g|png|gif|bmp|ico)$ [NC]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
现在,结束了。我们现在检查是否请求了图像:
RewriteCond %{REQUEST_URI} \.(jpe?g|png|gif|bmp|ico)$ [NC]
RewriteRule ^ /public/errors/image-not-found.png [R,L]
与其他静态文件类似:
RewriteCond %{REQUEST_URI} \.(html|css|js|swf)$ [NC]
RewriteRule ^ - [R=404,L]
现在将所有内容重定向到index.php
:
RewriteCond %{REQUEST_URI} !/index\.php$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f [NC]
RewriteCond %{REQUEST_FILENAME} !-d [NC]
RewriteRule ^.*$ /index.php?url=$0 [R,L]
答案 1 :(得分:0)
以下一系列规则应该可能模仿流程图:
# for public folder pass through
RewriteRule ^public/.+?\.(?:jpe?g|ico|png|bmp|css|js|html|swf)$ - [L,NC]
# for other images
RewriteRule ^.+?\.(?:jpe?g|ico|png|bmp)$ /public/errors/img-not-found.jpg [L,NC,R=302]
# for other css|js|html|swf URIs
RewriteRule ^.+?\.(?:css|js|html|swf)$ - [L,NC,R=404]
# everything else, route to index.php
RewriteRule ^((?!index\.php).+)$ index.php?url=$1 [NC,QSA,L]