2015-09-29 75 views
1

我基本上想要重定向所有请求到index.php不重要什么,除了那些与某些REQUEST_URI。那些看起来像图像文件的请求应该被检查,并且如果它们位于public/文件夹(或任何深度的任何子文件夹)下,则应该检查它们,如果它们是应该提供的,则应该停止重写过程,例如:.jpg.png这里!如果不是,我想重定向到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.phpApache重写模块,复杂的规则

我有一半的措施解决:
这是我如何重定向一切index.php:

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

我追加了我想要的视觉解释。也许这是更清晰的:flowchart

+1

你的要求看起来不必要的复杂,并且将无尽的网址数量同步到相同的现有图像或样式表或html文件中,可能会导致重复的内容警告和在搜索引擎中受到惩罚。 “它位于x或**任何随机子文件夹**下”是一种接近我认为的错误方式。 – Sumurai8

回答

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] 
+0

问题是,当我请求一个存在于public('public/test.jpg'或'public/images/test.jpg')的图像时,它被重定向到'/ public/errors/image-not- found.png' – ACs

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]