need to preserve / in location

Gregory Edigarov edigarov at qarea.com
Fri Apr 24 13:54:47 UTC 2020


Maxim,

Thanks for a great explanation.

On 2020-04-22 18:17, Maxim Dounin wrote:
> Hello!
>
> On Wed, Apr 22, 2020 at 11:46:25AM +0300, Gregory Edigarov wrote:
>
>> Hello, Everybody
>>
>> this is directory structure:
>>
>> /front/admin/index.html
>>
>> /front/superadmin/index.html
>>
>> that's what I have in config
>>
>>      rewrite ^/(admin)$ /$1/ last;
>>      location /admin/ {
>>          index index.html;
>>          root /front;
>>          try_files $uri  admin/index.html;                 #direct all request to index.html
>>     }
>>
>> and the errors:
>>
>> 2020/04/22 08:35:13 [error] 73#73: *1 open() "/frontindex.html" failed (2:
>> No such file or directory), client: 192.168.224.1, server: , request: "GET
>> /admin HTTP/1.1", host: "127.0.0.1"
>> 192.168.224.1 - - [22/Apr/2020:08:35:13 +0000] "GET /admin HTTP/1.1" 404 146
>> "-" "curl/7.58.0" "-"
> That's stange, because with the configuration given the "/admin"
> request is expected to be mapped into "admin/index.html" as per
> try_files, and will end up opening "/frontadmin/index.html".
>
> 2020/04/22 17:42:59 [error] 38574#100110: *1 open() "/frontadmin/index.html" failed (2: No such file or directory), client: 127.0.0.1, server: , request: "GET /admin HTTP/1.1", host: "127.0.0.1:8080"
>
>> 2020/04/22 08:35:24 [error] 73#73: *2 open() "/frontindex.html" failed (2:
>> No such file or directory), client: 192.168.224.1, server: , request: "GET
>> /admin/ HTTP/1.1", host: "127.0.0.1"
>> 192.168.224.1 - - [22/Apr/2020:08:35:24 +0000] "GET /admin/ HTTP/1.1" 404
>> 146 "-" "curl/7.58.0" "-"
> Same here.
>
> 2020/04/22 17:46:20 [error] 38574#100110: *2 open() "/frontadmin/index.html" failed (2: No such file or directory), client: 127.0.0.1, server: , request: "GET /admin/ HTTP/1.1", host: "127.0.0.1:8080"
>
>> what's the right config in situation given?
> The right config depends on what you are trying to get.  In most
> cases, just as simple configuration with appropriate "root" will do
> what's expected ("index index.html;" is the default and can be
> safely omitted):
>
>      location / {
>          root /front;
>      }
>
> With such a configuration any request to "/admin" will end up with
> a redirect to "/admin/" (as long as "/front/admin" is a
> directory).  Any request to "/admin/" will return
> "/front/admin/index.html" (if exists).  And any request to a
> non-existent file will return 404.
>
> If you really want to return a positive response regardless of
> whether a file exists or not, adding a leading "/" before
> "admin/index.html" in your configuration might work for you:
>
>       rewrite ^/(admin)$ /$1/ last;
>       location /admin/ {
>           root /front;
>           try_files $uri /admin/index.html;
>      }
>
> (Note that "index index.html;" is meaningless - it is never used,
> as "try_files" without explicitly specified trailing "/" prevents
> access to directories.)
>
> Alternatively, you may want to simplify configuration into
> something like:
>
>      root /front;
>
>      location = /admin {
>          rewrite ^ /admin/ last;
>      }
>
>      location /admin/ {
>          error_page 404 = /admin/index.html;
> 	log_not_found off;
>      }
>
> This configuration works much like the one with only "location /"
> above, but explicitly handles requests to "/admin" similarly to
> how it's handled in your configuration, and also handles 404
> errors to return appropriate index file.



More information about the nginx mailing list