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