Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I have setup nginx with gallery2 on an internal server. Everything works fine under apache2 which I checked first, it used to be on apache2.

Problem is: gallery2 seems to generate url with '+' sign in it for file names/ images which had spaces in it, so a file like "may report.jpg" becomes "may+report.jpg"

The URL rewrite works, but gallery2 throws an error for file not found. This does not happen under apache2.

Here is my nginx rewrite rule:

   location / {
        index  main.php index.html;
        default_type text/html;
        # If the file exists as a static file serve it
        # directly without running all
        # the other rewite tests on it
        if (-f $request_filename) {
                break;
        }
        }
        location /v/
        {
   #    if ($request_uri !~ /main.php)
    #           {
                rewrite ^/v/(.*)$ /main.php?g2_view=core.ShowItem&g2_path=$1
                last;
#                }
        }

        location /d/
        {
        if ($request_uri !~ /main.php)
        {
                rewrite ^/d/([0-9]+)-([0-9]+)/(.*)$ /main.php?g2_view=core.DownloadItem&g2_itemId=$1&g2_serialNumber=$2&g2_fileName=$3
                last;
        }
        }


  location ~ \.php$ {
            fastcgi_pass   127.0.0.1:8889;
            fastcgi_index  main.php;
            fastcgi_intercept_errors on; # to support 404s for PHP files not found
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
            fastcgi_param SERVER_NAME $host;
            fastcgi_read_timeout 300;
        }

The site on its own works fine. Only the images with spaces in file name do not display in album view and also when clicking the the image for full page view will throw this error:

Error (ERROR_MISSING_OBJECT) : Parent 103759 path report+april+456.flv
in modules/core/classes/helpers/GalleryFileSystemEntityHelper_simple.class at line 98 (GalleryCoreApi::error)
in modules/core/classes/GalleryCoreApi.class at line 1853 (GalleryFileSystemEntityHelper_simple::fetchChildIdByPathComponent)
in modules/core/classes/helpers/GalleryFileSystemEntityHelper_simple.class at line 53 (GalleryCoreApi::fetchChildIdByPathComponent)
in modules/core/classes/GalleryCoreApi.class at line 1804 (GalleryFileSystemEntityHelper_simple::fetchItemIdByPath)
in modules/rewrite/classes/RewriteSimpleHelper.class at line 45 (GalleryCoreApi::fetchItemIdByPath)
in ??? at line 0 (RewriteSimpleHelper::loadItemIdFromPath)
in modules/rewrite/classes/RewriteUrlGenerator.class at line 103
in modules/rewrite/classes/parsers/modrewrite/ModRewriteUrlGenerator.class at line 37 (RewriteUrlGenerator::_onLoad)
in init.inc at line 147 (ModRewriteUrlGenerator::initNavigation)
in main.php at line 180
in main.php at line 94
in main.php at line 83
System Information
Gallery version  2.2.4
PHP version  5.3.6 fpm-fcgi
Webserver    nginx/0.8.55
Database     mysqli 5.0.95
Toolkits     ImageMagick, Thumbnail, Gd
Operating system     Linux CentOS-55-64-minimal 2.6.18-274.18.1.el5 #1 SMP Thu Feb 9 12:45:44 EST 2012 x86_64
Browser  Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5

In the report above there is usable system information if that helps. I know the nginx is old but it comes as default in centos repo and I am not sure if upgrading will fix the problem or break something else.

It seems gallery2 must map the '+' to space internally, but why it's not doing so with nginx I can't tell.

EDIT: I just verified that if I change the '+' sign to %20 then gallery2 works. but gallery2 is generating URL as '+'. I found a (maybe) related problem here for IIS7 and Gallery2 http://forums.asp.net/t/1431951.aspx

EDIT2: Accessing the URL without rewrite and having the + sign works. Must be something to do with rewrite. Here is the relevant apache2 rule that might be of help:

RewriteCond %{THE_REQUEST} /d/([0-9]+)-([0-9]+)/([^/?]+)(\?.|\ .)
    RewriteCond %{REQUEST_URI} !/main\.php$
    RewriteRule .   /main.php?g2_view=core.DownloadItem&g2_itemId=%1&g2_serialNumber=%2&g2_fileName=%3   [QSA,L]

RewriteCond %{THE_REQUEST} /v/([^?]+)(\?.|\ .)
    RewriteCond %{REQUEST_URI} !/main\.php$
    RewriteRule .   /main.php?g2_path=%1   [QSA,L]
share|improve this question
    
i fixed it by editing code in gallery2. is all i have for now –  Vangel Jul 6 '12 at 4:03
    
You can also rewrite your query string and change + to %20 using mod_rewrite - seems to me a bit better than modifying application –  Kamil Šrot Nov 11 '12 at 20:11
    
That did not work. already tried. Gallery2 actually does something to the value again internally. It throws a security error if you tried to rewrite the way you are saying. I suppose you have not tried this with gallery2. If you have please post me the relevant rule of nginx in the answer. –  Vangel Nov 12 '12 at 11:53
    
Please note that a space is (correctly) replaced by a plus (+) in the form data if a specific encoding is chosen (stackoverflow.com/questions/2678551/…). In URLs the correct encoding is %20. The latter is replaced by a space before the nginx rewrite engine is applied. Try this: Replace a space by %20 during rewriting the URL. –  BurninLeo Aug 17 '13 at 8:00

1 Answer 1

Maybe the problem is with your ifs statements inside location blocks, Take a look to IfIsEVil(http://wiki.nginx.org/IfIsEvil):

Directive if has problems when used in location context, in some cases it doesn't do what you expect but something completely different instead. In some cases it even segfaults. It's generally a good idea to avoid it if possible.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.