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網頁上的點選按鈕(事件gotointroducion)跳轉url連結地址無效沒有反應
本來這個是個簡單事情,可就是便便搞了幾個小時,比如,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,代