nginx userdir 无波浪号

nginx userdir 无波浪号

通常,网络服务器中的 userdir 会~在用户名前加上前缀,例如https://example.com/~me/访问/home/me/public_html/

现在,由于$reasons,我需要设置一个 nginx 服务器来为/home/${user}/public_html/没有此~前缀的目录提供服务:https://example.com/me/. 在同时,网络服务器还应提供来自网络根目录 ( /var/www/html/) 的内容。

我不太在意内容在两个地方都可用的情况(例如https://example.com/foo/index.html/var/www/html/foo/index.html可由和两者提供服务/home/foo/public_html/index.html

答案在这里服务器故障引导我到了这个配置:

location ~ (?<user>[^/]+)(?<path>.*)?$ {
  alias /home/$1/public_html$2;
  index index.html index.htm;
  autoindex on;
}

这没问题,但不幸的是,它也会遮蔽 webroot(所以我不能再/var/www/html/index.html通过https://example.com/index.html)。

所以我的第二次尝试是这样的:

location ~ (?<user>[^/]+)(?<path>.*)?$ {
  root /home/$user/public_html;
  try_files $path $path/ @fallback;
  index index.html index.htm;
  autoindex on;
}

location @fallback {
  root /var/www/html/;
  index index.html index.htm;
}

这使我能够/home/me/public_html/index.html通过以下方式访问https://example.com/me/index.html/var/www/html/index.html通过https://example.com/index.html

它还允许我/home/me/public_html/bla/index.html通过https://example.com/me/bla/

不幸的是,事情发生了变化https://example.com/me/bla(请注意缺少尾部斜杠):nginx 将发出永久重定向(301)至https://example.com/bla/(去掉我的用户名!它实际上应该只重定向到https://example.com/me/bla/)。这会导致大量 404 错误(当/var/www/html/bla/不存在时)或错误内容(当存在时)。

我确信人们会忘记添加尾随斜杠,然后最终进入错误的(或不存在的)目录。

我的直觉是,这个错误的重定向是由于我root在位置块中使用了。使用 不会出现这样的问题alias,但是在这种情况下我该如何使用try_files和 来作为后备位置?

那么:我怎样才能教会 nginx 在没有 , 的情况下提供 userdirs ~,同时仍然提供来自我的 webroot 的内容,并允许用户/在想要访问 web 服务器上的目录时忘记输入尾随?

答案1

昨晚我突然灵光一闪,想出了一个改进的正则表达式,可以让我将其try_filesalias指令结合起来,从而无需使用指令root

这是最终的配置,它似乎可以满足我的所有要求:

    root /var/www/html;
    location ~ (?<user>[^/]+)(?<path>.*/)?(?<file>.*)?$ {
        alias /home/$user/public_html/$path;
        try_files $file $file/ @fallback;

        index index.html index.htm;
        autoindex on;
    }

    location @fallback {
        index index.html index.htm;
    }
    location / {
        index index.html index.htm;
    }

我不太喜欢将其复制location @fallbacklocation /块中,但我想我现在可以忍受它。

正如我的问题中提到的,这将会/home/foo/public_html/覆盖/var/www/html/foo/。我想知道我是否可以恢复它(以便/var/www/html/foo/覆盖/home/foo/public_html/) - 但同样,这不是高优先级。

相关内容