天天看點

Apache 檔案不存在跳轉URL(實作指定尺寸的圖檔不存在,就自動生成圖檔)前言場景需求解決思路Apache 配置

在做很多系統的時候,我們可能都有這樣的需求:

在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 怎麼配置,來實作 “當檔案不存在的時候,轉發請求到處理程式”。

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)

      需要添加的配置内容為:

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

關于圖檔的處理,推薦大家可以去了解下 graphicsmagick 處理圖檔的。

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

利用這種方法,也可以做其他需求,比如網頁的靜态化:index.do 用來生成 index.html ,apache 判斷如果有html存在就直接響應給浏覽器,如果不存在就轉發到 index.do 處理生成 index.html 

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

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

(完)