通常,网络服务器中的 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_files
与alias
指令结合起来,从而无需使用指令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 @fallback
到location /
块中,但我想我现在可以忍受它。
正如我的问题中提到的,这将会/home/foo/public_html/
覆盖/var/www/html/foo/
。我想知道我是否可以恢复它(以便/var/www/html/foo/
覆盖/home/foo/public_html/
) - 但同样,这不是高优先级。