1. 程式人生 > >Apache 檔案不存在跳轉URL(實現指定尺寸的圖片不存在,就自動生成圖片)

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 

注意:生成圖片的這個處理,對同一個圖片處理那段程式碼要做好加鎖或同步處理,防止出現高併發情況下,讀取和生成圖片因為資源佔用而出問題的情況。

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

(完)

相關推薦

Apache 檔案存在URL實現指定尺寸圖片存在自動生成圖片

前言在做很多系統的時候,我們可能都有這樣的需求:在CMS中只維護一張圖片,而這張圖片在網站的很多地方都需要顯示,而且顯示的大小不同。一般做法就是直接使用這張圖片,在不同的地方使用 width 和 height 設定圖片的顯示大小。場景需求一般情況下這樣做其實就可以了。如下這個

Jmeter錄制https協議成功證書導入

images https ref 請求 com tar targe 技術 成功 原文: http://www.cnblogs.com/Lam7/p/7154120.html 錄制腳本的時候,比如錄制https協議的百度網站 https://www.ba

表中多個按鈕進行操作需要頁面的實現

有一個通用的需求,就是在一張表格中對一條記錄進行多種操作,計劃採取ajax非同步方式的操縱資料庫。 主檢視: <td> <div class="btn-group btn-group-sm">

單頁面添加返回和動畫仿app 只對單頁面和有用我用的是angualr會的可以私信問我。

hist page func margin consola color -s tar pla p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #596972 } p.p2 { mar

在開啟的xml檔案Ctrl+左鍵 定位的問題

1、依次選擇:Window -> Preferences -> General -> Editors -> File Associations ;2、依次選中:File type

android webview網頁上的點選按鈕事件gotointroducionurl連結地址無效沒有反應

本來這個是個簡單事情,可就是便便搞了幾個小時,比如,webview載入網頁,裡面有個按鈕點選跳轉到另一個網頁,當點選的時候按鈕是有反應的,但網頁log列印gotointroducion,有點矇蔽,不知道什麼意思?百度也沒有,搜尋了很久。用了很多種方法都沒有解決,最後還是艱難的解決了。 一些j

實現登入頁面登入成功後過程個人理解學習程式碼完整

function login()    {        var userName = document.getElementById("loginName").value;//通過ID獲取元素        var pwd = document.getElementById

【轉發】centos 7開啟FTP以及新增使用者配置許可權只允許訪問自身目錄根目錄 linux下ftp配置檔案詳解

1.切換到root使用者 2.檢視是否安裝vsftp,我這個是已經安裝的。 [[email protected] vsftpd]# rpm -qa |grep vsftpd vsftpd-3.0.2-11.el7_2.x86_64 3.如果沒有發現,則安裝。 yum ins

SpringMVC統一異常處理返回異常資料而到某個頁面的方法

關於SpringMVC統一異常處理的問題,網搜一大把。網上搜的關於如何進行統一異常處理不外乎如下三種方式: Spring MVC處理異常有3種方式: (1) 使用Spring MVC提供的簡單異常處理器SimpleMappingExceptionResol

自定義submit實現ajax提交form表單重新整理

問題描述: 1.最近一直在為使用者資訊完善功能所困惑,想要實現:使用者提交資訊後不跳轉到acction()的服務端頁面,只要告訴提交成功即可。 2.論壇上大多ajax+json等方法/框架($ajaxform)都需要匯入包或者js檔案,本人新手 ,對於導

微信小程式——wx.navigateTo中url無法問題app.json中配置的tabBar與wx.navigateTo中url引用相同頁面導致(2017/12)

今天在做小程式的時候,在編寫 wx.navigateTo({ url:'../index/index' }) 進行頁面跳轉的時候發現是使用不成的。經過研究,發現錯誤的導致原因是因為在app.json中存在: "tabBar": { "list": [{ "pageP

AppStore url連結

1、如果是在應用內部跳轉到Appstore只需執行如下程式碼 1、跳轉到應用詳情 [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@”itms-apps://itunes.appl

iOS10 系統設定解決辦法1

iOS 10 更新以後,發現以前跳轉系統應用的方法無效了。 -(void)toWIFI { NSURL *url = [NSURL URLWithString:@"prefs:root=WIFI"]; if ([[UIApplicati

Linux 學習筆記 檔案系統中

1. 檔案系統樹結構 windows 分割槽 Windows 情況開始分析,硬碟會被分為多個分割槽(C 盤、D 盤 … ),每個分割槽之上會看到很多資料夾: Linux 分割槽 Linux 中分割槽不叫 C 盤、D 盤了,叫 sda1、sda2 … 但是檔案系

織夢提交表單進行

emp 管理 echo style ech history 文件 進行 跳轉 找的plus文件裏的diy.php 在100行 $bkmsg = ‘發布成功,請等待管理員處理...‘;後面添加echo "<script>alert(‘提交成功!‘); histor

nginx證書制作以及配置https並設置訪問http自動https反向代理轉發jboss

app ast mime with cati permanent bsp location admin nginx證書制作以及配置https並設置訪問http自動跳轉https 默認情況下ssl模塊並未被安裝,如果要使用該模塊則需要在編譯時指定–with

Spring Security4.1.3實現攔截登錄後向登錄頁面方式redirect或forward返回被攔截界面

response href tools 當前 錯誤 界面 sets view 鏈接 一、看下內部原理 簡化後的認證過程分為7步: 用戶訪問網站,打開了一個鏈接(origin url)。 請求發送給服務器,服務器判斷用戶請求了受保護的資源。

簡單的安卓點擊按鈕示例整蠱扣費

ref nat cow userinfo dsv href 盜鏈 ocs 跳轉 v2勘7灸1沒疤9得Lhttp://www.docin.com/qkvl6227 Ei053K衛3GWM強蔥Ihttp://weibo.com/p/1005056373158586 塵拍

SetProcessWorkingSetSize() 方法使內降低了很多把內存放到交換區其實會降低性能——打開後長時間使用軟件會有很長時間的加載過程原來是這個!

相關 opera UNC 情況下 縮小 ole careful however guarantee 在項目中對程序性能優化時,發現用SetProcessWorkingSetSize() 方法使內存降低了很多,於是查閱了相關的資料如下: 我的程序為什麽能夠將占用的內存

html js點擊按鈕滾動定位到頁面指定位置DIV的方法代碼

實現 定向 觸發 提交按鈕 a標簽 原理 標簽 baidu 就是 一:通過html錨點實現滾動定位到頁面指定位置(DIV): 如果我們要點擊實現跳轉的地方是一個html錨點,也就是點擊一個A標簽超鏈接實現跳轉,可以把A標簽的href屬性直接指向跳轉指定位置的div,代