Apache Rewrite模块,复杂规则

时间:2015-09-29 14:56:24

标签: .htaccess mod-rewrite redirect

我基本上想要将所有请求重定向到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]

我附加了我想要的视觉解释。也许这更清楚:flowchart

2 个答案:

答案 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]