Invalid content types served when using alias

Vladimir Shebordaev vshebordaev at mail.ru
Fri Oct 26 02:19:29 UTC 2012


Hi!

Well, just in case, this inlined version of ngx_http_set_exten() 
function seems to set r->exten in non-intrusive way when it is 
not known from URI but can be obtained from the file redirect path

Index: src/http/modules/ngx_http_static_module.c
===================================================================
--- src/http/modules/ngx_http_static_module.c	(revision 4892)
+++ src/http/modules/ngx_http_static_module.c	(working copy)
@@ -224,6 +224,24 @@
          return NGX_HTTP_INTERNAL_SERVER_ERROR;
      }

+    if (!r->exten.len) {
+        last = path.data + path.len - 1;
+        while (last > path.data + 1) {
+            if (last[-1] == '.' && last[-2] != '/') {
+
+                r->exten.data = last;
+                r->exten.len = path.len - (last - path.data);
+
+                break;
+
+            } else if (last[-1] == '/') {
+                break;
+            }
+
+            last--;
+        }
+    }
+
      if (ngx_http_set_content_type(r) != NGX_OK) {
          return NGX_HTTP_INTERNAL_SERVER_ERROR;
      }

This way, the MIME type guessed from the file redirect extension 
is sent to client instead of the default one, when it is not 
known from the original URI.

Otherwise, I'd suggest to update an 'alias' directive 
documentation to explicitly state that the default MIME type is 
used when it can not be guessed from the original location URI 
even if it is a file alias.

Hope it helps.

Regards,
Vladimir

On 24.10.2012 18:32, Maxim Dounin wrote:
> Hello!
>
> On Wed, Oct 24, 2012 at 05:59:33PM +0400, Vladimir Shebordaev wrote:
>
>> Hi!
>>
>> On 24.10.2012 03:50, Tom van der Woerdt wrote:
>>> Hi all,
>>>
>>> I'm using nginx' locations to serve a javascript file on '/client' :
>>>
>>>      location = /client {
>>>          expires epoch;
>>>          alias /path/to/a/file.js;
>>>      }
>>>
>>> Works fine, with one major exception: it gets an octet-stream
>>> Content-Type header.
>>
>> This is due to a bug in static module, it doesn't properly set
>> r->exten in this case, so the redirect gets default mime-type.
>
> As already explained by Igor, this is not a bug, but intentional
> behaviour.
>
> Extension as seen in the URI is used to determine mime type, not
> one on the file system (which might not be present at all).
>
>>
>> Please try this patch
>>
>> Index: src/http/modules/ngx_http_static_module.c
>> ===================================================================
>> --- src/http/modules/ngx_http_static_module.c	(revision 4892)
>> +++ src/http/modules/ngx_http_static_module.c	(working copy)
>> @@ -224,6 +224,9 @@
>>           return NGX_HTTP_INTERNAL_SERVER_ERROR;
>>       }
>>
>> +    r->uri = path;
>> +    ngx_http_set_exten(r);
>> +
>>       if (ngx_http_set_content_type(r) != NGX_OK) {
>>           return NGX_HTTP_INTERNAL_SERVER_ERROR;
>>       }
>
> The patch is completely incorrect.  While it might work for you in
> this particular case, it
>
> a) Breaks the behaviour which is expected to work (in contrast to
> the above), e.g. like this:
>
>      location = /foo.js {
>          alias /path/to/a/file;
>      }
>
> b) Breaks unrelated things like the $uri variable.
>
>



More information about the nginx-devel mailing list