我在nginx version: nginx/1.10.3 (Ubuntu)
上运行Ubuntu 16.04.2 LTS
。
我使用nginx
来提供静态文件,由webpack
生成的捆绑包,但这是非常的。
我想要实现的目标是:
在example.com
我需要投放/home/bundles/main/index.html
。我可以这样做。
在projects.example.com/project_1
我想提供/home/bundles/project_1/index.html
。
在projects.example.com/project_2
我想提供/home/bundles/project_2/index.html
。
最后两个,我做不到。当我转到projects.example.com/project_1
或projects.example.com/project_2
时,我会收到默认的nginx页面。
让事情变得更加混乱/etc/nginx/sites-enabled/default
完全被注释掉了。
此外,如果在我location
的{{1}}区块中,我将projects.example.com
替换为project_1
,我将会为该特定项目提供服务,但之后我会无法为对方服务。
贝娄,我会告诉你我的nginx配置
/
感谢您的帮助!
修改
我找到的解决方案是使用server {
listen 80;
server_name example.com;
location / {
root /home/bundles/main;
try_files $uri /index.html;
}
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name example.com;
location / {
root /home/bundles/main;
try_files $uri /index.html;
}
ssl_certificate ...
ssl_certificate_key ...
}
server {
listen 80;
server_name projects.example.com;
location /project_1 {
root /home/bundles/project_1;
try_files $uri /index.html;
}
location /project_2 {
root /home/bundles/project_2;
try_files $uri /index.html;
}
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name projects.example.com;
location /project_1 {
root /home/bundles/project_1;
try_files $uri /index.html;
}
location /project_2 {
root /home/bundles/project_2;
try_files $uri /index.html;
}
ssl_certificate ...
ssl_certificate_key ...
}
更改root
。
alias
解决方案基于这两个答案。第一个answer显示如何解决问题,第二个answer提供有关server {
listen 80;
server_name example.com;
location / {
root /home/bundles/main;
try_files $uri /index.html;
}
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name example.com;
location / {
root /home/bundles/main;
try_files $uri /index.html;
}
ssl_certificate ...
ssl_certificate_key ...
}
server {
listen 80;
server_name projects.example.com;
location /project_1 {
alias /home/bundles/project_1;
index index.html;
}
location /project_2 {
alias /home/bundles/project_2;
index index.html;
}
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name projects.example.com;
location /project_1 {
alias /home/bundles/project_1;
index index.html;
}
location /project_2 {
alias /home/bundles/project_2;
index index.html;
}
ssl_certificate ...
ssl_certificate_key ...
}
工作原因和alias
的解释。
引用@treecoder
如果是root指令,则将完整路径附加到根,包括位置部分,而在alias指令的情况下,只有路径中不包括位置部分的部分会附加到别名。
在我的特定情况下,这会像这样翻译;
使用root
,尝试访问的路径root
将为nginx
。
使用/home/bundles/project_1/project_1
,它会访问正确的路径alias
。
回到一个级别,例如,说:
/home/bundles/project_1
也不是一个真正的选择。这是因为我的项目实际上并没有被称为root /home/bundles/
和project_1
。实际结构更类似于此。
在project_2
我有目录/bundles
和project_a
。我想将project_b
路由到project_1
目录,将project_a
路由到project_2
目录。
这就是我使用project_b
的原因。
我希望这会有所帮助。
答案 0 :(得分:1)
你有:
location /project_1 {
root /home/bundles/project_1;
try_files $uri /index.html;
}
因此root
仅针对以/project_1
开头的URI定义。对于任何其他URI,将使用默认的root
。
如果您展示URI /project_1/
(尾随/
),假设default index
directive生效,nginx
应该返回您的/project_1/index.html
内容
但是,找不到URI /project_1
- 因此会返回/index.html
。 URI /index.html
不以/project_1
开头,因此使用默认根。
如果您希望URI /project_1
按预期工作,并且要转到项目的index.html
文件的默认操作,请更改try_files
指令。
location /project_1 {
root /home/bundles/project_1;
try_files $uri $uri/ /project_1/index.html;
}
有关详情,请参阅this document。
由于两个项目共享一个公共根,因此可以简化如下:
server {
listen 80;
server_name projects.example.com;
root /home/bundles
index index.html;
location /project_1 {
try_files $uri $uri/ /project_1/index.html;
}
location /project_2 {
try_files $uri $uri/ /project_2/index.html;
}
location / {
deny all;
}
}
我添加了index
指令以避免依赖于默认值(相同),并添加location
块以拒绝访问项目之外的区域。
答案 1 :(得分:0)
我遇到了同样的问题...对于我来说,原来的默认站点正在“超越”我想要的辅助站点并提供默认文件...那么它允许IP6请求和我的新站点没有。
这是我的access.log的示例:
::1 - - [05/Sep/2020:15:05:16 -0600] "GET / HTTP/1.1" 200 40 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36"
是否注意到::1
位?我想我的浏览器默认是IP6请求。因此,我只是通过更改以下内容来确保在我的站点配置文件中启用有问题的站点的本地IP6请求:
listen 80;
server_name example.local;
收件人:
listen 80;
listen [::]:80;
server_name example.local;
就是这样。