Apache 文件不存在跳转URL(实现指定尺寸的图片不存在,就自动生成图片)

前言

在做很多系统的时候,我们可能都有这样的需求:

在CMS中只维护一张图片,而这张图片在网站的很多地方都需要显示,而且显示的大小不同。

一般做法就是直接使用这张图片,在不同的地方使用 width 和 height 设定图片的显示大小。

场景需求

一般情况下这样做其实就可以了。如下这个场景,如果通过这样做,可能就不太合适了。

场景:CMS 有个海报管理功能,每个大的海报都是一张 1000*2000px 的图片,而且对海报的清晰度有一定的要求,质量不能太差,假定一个海报有 1MB。

然后在网站上有一个海报列表,每页显示20个海报。

这种情况下如果我们还用一张图片,通过 width 和 height 来设定图片显示大小的话,那就太不合适了,一个列表页面下来,20多MB没有了。页面显示肯定会很慢。

解决思路

我们一般的做法有:

1、在CMS中上传一个海报大图,再上传一个海报小图。

2、在CMS中上传一个海报大图,保存的时候,系统自动生成一个海报小图。

3、在CMS中上传一个海报大图,在网页请求图片的时候,附带需求图片的 width 和 height,程序自动判断需求图片是否存在,如果不存在则使用对应的大图生成一个图片响应到客户端。

上面三种做法,1、2 两种情况不够灵活,如果系统还有更多地方需要显示不同尺寸的这样的图片呢?或者系统二期、三期……扩展的时候也有可能有更多尺寸的图片需求呢?

至于第三种方法,相对比较灵活,只有在我们需要的时候才生成。

我们现在需要使用 Apache 来处理我们的静态图片资源。一般情况下 Apache 可不会去管你的图片存在不存在,当我们访问一个新的尺寸图片时,服务器上不存在图片文件,Apache 就直接响应404了。

现在我们要做的就是,让Apache 来判断文件是否存在,如果文件不存在就转而请求我们生成图片的请求。

这样以来,每个尺寸的图片,在需求的时候,第一次 Apache 会交给我们的程序去生成图片,以后这个图片存在了,就全部由Apache 自己管理了。

Apache 配置

下面来说一下 Apache 怎么配置,来实现 “当文件不存在的时候,转发请求到处理程序”。

1、开启 rewrite 模块

去除httpd.conf文件中 #LoadModule rewrite_module modules/mod_rewrite.so 前面的"#"号

2、在 httpd.cnf 中增加配置(没有位置要求,一般我们放在文件最后即可)

我是用的是 apache 2.4 的 VirtualHost ,图片处理程序是用的 Tomcat,所以也给Apache 添加了mod_jk 模块(这个本文不做讲解,可以查看帖子 http://blog.csdn.net/catoop/article/details/47974773)

需要添加的配置内容为:

        <IfModule mod_rewrite.c>
                RewriteEngine On
                # ‘-s‘ (is regular file, with size)
                # ‘-l‘ (is symbolic link)
                # ‘-d‘ (is directory)
                # ‘ornext|OR‘ (or next condition)
                # ‘nocase|NC‘ (no case)
                # ‘last|L‘ (last rule)
                # ‘QSA‘ 追加请求字符串

                RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-s
                RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-l
                RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f

                #RewriteRule ^(.*)\.[jpg|png|bmp]$ %{HTTP_HOST}/createimage.jsp?path=%{REQUEST_URI} [NC,L]
                #RewriteRule ^(.*)\.(jpg|png|bmp)$ createimage.jsp?path=%{REQUEST_URI} [NC,L]
                RewriteRule ^(.*)\.(jpg|png|bmp)$ http://shanhyweb.example.com/createimage.jsp?path=%{REQUEST_URI} [NC,L]
                #RewriteRule ^(.*)\.(jpg|png|bmp)$ /createimage.jsp?path=%{REQUEST_URI} [NC,L]

        </IfModule>

配置可以直接在 httpd.cnf 中添加,也可以在 VirtualHost  中配置,因为我使用的是 VirtualHost 所以我的配置是在 apache2/conf/extra/httpd-vhosts.conf 中,如下:

########################################################
LoadModule jk_module modules/mod_jk.so
Include conf/mod_jk.conf
########################################################
<VirtualHost *:80>
    #ServerAdmin [email protected]
    DocumentRoot "/svcroot/runtime/webstatic/shanhyweb"
    ServerName shanhyweb.example.com
    #ServerAlias www.shanhyweb.example.com
    ErrorLog "logs/shanhyweb-error_log"
    CustomLog "logs/shanhyweb-access_log" common
        <IfModule mod_jk.c>
                #日志输出文件(其他配置也可以重写mod_jk.conf里面的配置)
                JkLogFile logs/mod_jk_shanhyweb.log
                #指URL指向如果有servlet,则让worker_web去处理
                JkMount /servlet/* worker_web
                #指URL为/*.jsp的页面,让worker_web去处理
                JkMount /*.jsp worker_web
                #指URL为/*.do的页面,让worker_web去处理
                JkMount /*.do worker_web
                #指URL为/*.json的页面,让worker_web去处理
                JkMount /*.json worker_web
        </IfModule>

	<IfModule mod_rewrite.c>
		RewriteEngine On
		# ‘-s‘ (is regular file, with size)
		# ‘-l‘ (is symbolic link)
		# ‘-d‘ (is directory)
		# ‘ornext|OR‘ (or next condition)
		# ‘nocase|NC‘ (no case)
		# ‘last|L‘ (last rule)
		# ‘QSA‘ 追加请求字符串

		RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-s
		RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-l
		RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f

		RewriteRule ^(.*)\.(jpg|png|bmp)$ http://shanhyweb.example.com/createimage.jsp?path=%{REQUEST_URI} [NC,L]

	</IfModule>

        <Directory "/svcroot/runtime/webstatic/shanhyweb">
                Options FollowSymLinks
                AllowOverride None
                Require all granted
        </Directory>
</VirtualHost>

关于图片的处理,推荐大家可以去了解下 GraphicsMagick 处理图片的。

===========================================

利用这种方法,也可以做其他需求,比如网页的静态化:index.do 用来生成 index.html ,Apache 判断如果有HTML存在就直接响应给浏览器,如果不存在就转发到 index.do 处理生成 index.html

注意:生成图片的这个处理,对同一个图片处理那段代码要做好加锁或同步处理,防止出现高并发情况下,读取和生成图片因为资源占用而出问题的情况。

------------------------------------

(完)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 01:18:53

Apache 文件不存在跳转URL(实现指定尺寸的图片不存在,就自动生成图片)的相关文章

Spring 中 AbstractExcelView 支持根据模板生成Excel文件. 通过设置 view 的 URL 属性指定模板的路径

 注意:1. 模板需放在 WEB-INF 目录下2. 指定模板路径时不需要添加扩展名, Spring将自动添加 .xls 到URL 属性中.3. 在指定URL前需先设置 view 的 ApplicationContext 1. 控制器配置 control-context.xml 1 <bean id="beanNameViewResolver" 2 class="org.springframework.web.servlet.view.BeanNameViewResol

ecshop设置一个子类对应多个父类并指定跳转url的修改方法

这是一篇记录在日记里面的技术文档,其实是对ecshop的二次开发.主要作用是将一个子类对应多个父类,并指定条跳转url的功能.ecshop是一款在线购物网站,感兴趣的可以下载源码看看.我们看看具体是怎么修改的. 1.数据库表“表前缀_category”添加如下字段 alter TABLE `ga_category` add `assign_child` varchar(255) default NULL; alter TABLE `ga_category` add `jump_url` varc

通过js跳转url下载包含中文的文件乱码问题解决方案(java)

问题描述: 通过js 跳转url的方式下载中文文件,因为中文文件名乱码找不到文件. 解决方案: 经过测试在tomcat 8 及以上不会出现这个问题: 以下解决方案博主亲测有效,如果您有更好的解决方案,请直接留言.互相进步. 如果是使用 tomcat7 在conf.server.xml中添加如下配置: URIEncoding="UTF-8" 配置完整: <?xml version="1.0" encoding="UTF-8"?> <

【php】Apache无法自己主动跳转却显示文件夹与php无法连接mysql数据库的解决方式

一.Apache无法自己主动跳转却显示文件夹 Apache无法自己主动跳转却显示文件夹这是由于Apacheserver下conf/httpd.conf没有配置好,其默认是不跳转,直接显示文件夹 首先,我们须要禁止Apache直接显示文件夹. 方法在搜索Options Indexes FollowSymLinks,将其该为Options FollowSymLinks 事实上.解决Apache无法自己主动跳转的问题.这是由于Apache本来仅仅是一个httpserver.不会自己主动跳转到index

paip.微信菜单直接跳转url和获取openid流程总结

#------不能直接跳转,贝儿提示不安全的链接.. #-------使用auth跳转. //todox 直接转到..  direct goto ViewButton skrechCard = new ViewButton("刮刮卡o428,view," + "https://open.weixin.qq.com/connect/oauth2/authorize?" + "appid="+appId+"&" + &qu

Apache 文件根目录设置修改方法 (Document Root)

最近在学习WordPress,使用appServ 在windows上搭建Php开发环境 在网上查找到的关于修改Apache服务器根目录的资料,对比学习,再此记录 在安装 Apache 时,系统会给定一个缺省的文件根目录. 如果你觉得将网页存在这个缺省目录不方便,觉得应该另外设个目录作为 Apache 文件根目录,你可以修改 Apache 的配置文件 httpd.conf 里有关文件根目录的设置. 假设Apache HTTP Server 的缺省文件根目录 (DocumentRoot) 是: Do

手机平板等移动端适配跳转URL的js代码

<script type="text/javascript"> if(/AppleWebKit.*mobile/i.test(navigator.userAgent) || (/MIDP|SymbianOS|NOKIA|SAMSUNG|LG|NEC|TCL|Alcatel|BIRD|DBTEL|Dopod|PHILIPS|HAIER|LENOVO|MOT-|Nokia|SonyEricsson|SIE-|Amoi|ZTE/.test(navigator.userAgent)

解决Wamp各版本中 Apache 文件列表图标无法显示

Edit the following file manually and change the path to the icons folder (it appears 2 times in the file) File to edit: \wamp\bin\apache\apache2.2.6\conf\extra\httpd-autoindex.conf Change the paths: C:/Program Files/Apache Software Foundation/Apache2

C# 网络编程之webBrowser获取网页url和下载网页中图片

该文章主要是通过C#网络编程的webBrowser获取网页中的url并简单的尝试下载网页中的图片,主要是为以后网络开发的基础学习.其中主要的通过应用程序结合网页知识.正则表达式实现浏览.获取url.下载图片三个功能.而且很清晰的解析了每一步都是以前一步为基础实现的. 一.界面设计 界面设计如下图所示,添加控件如图,设置webBrowser1其Anchor属性为Top.Bottom.Left.Right,实现对话框缩放;设置groupBox1其Dock(定义要绑到容器控件的边框)为Buttom,实