Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

Gallery2 在 nginx 底下的 rewrite 處理
post by tommy @ 02 十二月, 2011 16:51

由於 Gallery2 只有提供 Apache 的 rewrite 設定, 所以當轉換到 nginx 使用的時候, 就要想辦法自己來改寫.

我自己對於 gallery 的 virtualhost 設定像這樣:

server {
root /usr/share/gallery2;
index index.php;
 
server_name gallery.teatime.com.tw *.gallery.teatime.com.tw;
 
access_log /var/log/nginx/gallery-access.log;
error_log /var/log/nginx/gallery-error.log;
 
# rewrite rule for gallery
include conf/gallery2_rewrite.conf;
 
location / {
set $flag true;
set $get_image false;
valid_referers none blocked *.teatime.com.tw;
if ($invalid_referer) {
set $flag false;
}
if ($query_string ~ core\.DownloadItem) {
set $get_image true;
}
if ($get_image = false) {
set $flag true;
}
if ($flag = false) {
return 403;
}
if ($bots) {
return 403;
}
try_files $uri $uri/ index.php?q=$uri index.html?q=uri =404;
}
 
# rule from .htaccess
location ~* ^/lib/tool/po/ {
deny all;
}
location ~* \.(class|inc|xml) {
deny all;
}
# if we need to upgrade, remove this
location ~* ^/.+/.+\.php {
deny all;
}
location ~* ^/config\.php {
deny all;
}
location ~* ^\.inc {
deny all;
}
 
# redirect server error 404
include conf/error_404.conf;
# redirect server error pages to the static page /50x.html
include conf/error_50x.conf;
# deny some access
include conf/drop.conf;
 
# php support, reject $bots
include conf/php_no_bots.conf;
}

上頭有些對於原本 .htaccess 阻擋設定的轉換, 另外 rewrite rule 由於比較多, 就寫成另一個 conf/gallery2_rewrite.conf 的設定檔如下:

# gallery2
if (!-e $request_filename) {
rewrite ^/sitemap$ /main.php?g2_view=sitemap.Sitemap last;
rewrite ^/updates$ /main.php?g2_view=dynamicalbum.UpdatesAlbum last;
rewrite ^/popular$ /main.php?g2_view=dynamicalbum.PopularAlbum last;
rewrite ^/admin/$ /main.php?g2_view=core.SiteAdmin last;
rewrite ^/radom([^\?]+)$ /main.php?g2_view=dynamicalbum.RandomAlbum last;
rewrite ^/v/([^\?]+)/slideshowapplet\.html$ /main.php?g2_view=slideshowapplet.SlideshowApplet&g2_path=$1 last;
rewrite ^/d/([0-9]+)-([0-9]+)/([^\?]+)$ /main.php?g2_view=core.DownloadItem&g2_itemId=$1&g2_serialNumber=$2&g2_fileName=$3 last;
rewrite ^/v/([^\?]+)/slideshow\.html$ /main.php?g2_view=slideshowapplet.Slideshow&g2_path=$1 last;
rewrite ^/rating/([^?/]+)$ /main.php?g2_view=rating.RatingAlbum&g2_limit=$1 last;
rewrite ^/rss/([^\/\?]+)$ /main.php?g2_view=rss.Render&g2_name=$1 last;
rewrite ^/srss/([0-9]+)$ /main.php?g2_view=rss.SimpleRender&g2_name=$1 last;
rewrite ^/key/([^?/]+)$ /main.php?g2_view=keyalbum.KeywordAlbum&g2_keyword=$1 last;
rewrite ^/f/([^\?]+)$ /main.php?g2_controller=permalinks.Redirect&g2_filename=$1 last;
rewrite ^/v/([^\?]+)$ /main.php?g2_path=$1 last;
rewrite ^/([^\?]+)$ /main.php?g2_view=rewrite.FileNotFound last;
#rewrite ^/([^\?]+)$ /main.php?g2_controller=migrate.Redirect&g2_path=$1;
}

原本以為這樣子處理就可以了. (因為初步的測試都正常)

不過, 幾天後, 有人反應某些照片看不到縮圖, 也點不進去看該照片.... 比對之後, 發現檔名有空白字元的都不行 (由於目錄在建立時 Gallery 不允許空白, 所以目錄不會有問題). 原本檔案名稱如果有空白, 所轉出來的網址會用 + 來取代空白.

但是 nginx 在 rewrite 時, 會把 + 轉成 %2b, 所以... Gallery 收到後, 只會做一次轉換, 也就是把 %2b 轉回 +, 然後就去找那個檔案... 因為 + 應該是空白才對, 自然會找不到該檔案.

原本想由 nginx 這兒來修正, 不過... 想了又想,  實在找不出有什麼方法可以把這個轉換在 nginx 給改回來 (有人知道嗎?), 所以... 就只好去改 Gallery2 的程式碼了.

--- modules/core/classes/GalleryUtilities.class  2011-11-26 13:58:40.186252459 +0800
+++ modules.patch/core/classes/GalleryUtilities.class 2011-11-30 15:28:51.790757672 +0800
@@ -237,9 +237,27 @@
*/
function getRequestVariables() {
$values = array();
+ // twu2 begin
+ // is running in nginx?
+ $is_nginx = strncmp($_SERVER['SERVER_SOFTWARE'], 'nginx', 5) == 0 ? true : false;
+ // twu2 end
foreach (func_get_args() as $argName) {
+/* original code
$values[] = GalleryUtilities::_getRequestVariable(
GALLERY_FORM_VARIABLE_PREFIX . $argName);
+*/
+ $s = GalleryUtilities::_getRequestVariable(
+ GALLERY_FORM_VARIABLE_PREFIX . $argName);
+ // twu2 begin
+ // maybe fix the issue with nginx, it change + to %2b
+ // then we got + here (in fact , it's ' ')
+ // only convert for g2_path and g2_fileName
+ if ($is_nginx && ($argName == 'path' || $argName == 'fileName')) {
+ $x = str_replace('+', ' ', $s);
+ $s = $x;
+ }
+ $values[] = $s;
+ // twu2 end
}
 
/* Sanitize the input */

在 Gallery 中, 如果發現是在 nginx 底下執行時, 就去把 g2_path 與 g2_fileName 這兩個參數的 + 改成空白 (因為 Gallery 在接受照片的檔名時, 會把 + 改成 _ 來命名, 所以實際上不會存在含有 + 字元的檔名, 這樣子改應該不會有問題).

經過這樣的修改後, 看起來目前都還正常. (會不會有其他的問題.... 就碰到了才會知道了) 

Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 136 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS