【发布时间】:2020-07-12 12:50:45
【问题描述】:
我开发了一个具有以下结构的项目:
api.my-domain.com:一个内置于 Symfony 5 中的 Restfull API。app.my-domain.com:一个 Angular 应用程序。www.my-domain.com:一个简单但漂亮的 HTML/CSS/JS 登录页面。
这个结构是在 Ubuntu 服务器上使用 NGINX 提供的。 api 和 app 站点的配置文件运行良好。那里无事可做。
对于landing,我有一些自定义要求:
- 我需要将包含“login”或“pm-”的请求重定向到
app站点。 - 我需要支持多语言网站,所以:
- 当有人访问www.my-domain.com/**es**时,服务器应该显示index_es.html
- 当有人访问www.my-domain.com/**en**时,服务器应该显示index_zh.html
- 当有人访问www.my-domain.com/**ca**时,服务器应该显示index_ca.html
- 当有人访问www.my-domain.com时,服务器应该返回index_es.html;但它也应该允许访问服务器上的其他静态文件(图像、字体、样式...)以使登陆正常工作。
使用以下 NGINX 站点配置站点已满足此要求:
server {
server_name www.my-domain.com my-domain.com;
root /var/www/my-project/;
location = /es {
try_files /index_es.html /index.html;
}
location = /en {
try_files /index_en.html /index.html;
}
location = /ca {
try_files /index_ca.html /index.html;
}
location = / {
try_files /index_es.html /index.html;
}
location ~ ^/(login|pm-) {
return 301 $scheme://app.my-project.com$request_uri;
}
location / {
try_files $uri $uri/ /index_es.html;
}
error_log /var/log/nginx/my-project-error.log;
access_log /var/log/nginx/my-project-access.log;
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/my-project.com-0001/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/my-project.com-0001/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.my-project.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = my-project.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name www.my-project.com my-project.com;
listen 80;
return 404; # managed by Certbot
}
问题是,在我第一次尝试让它工作时,我没有输入以下代码:
location = / {
try_files /index_es.html /index.html;
}
因为我认为指定这个就足够了:
location / {
try_files $uri $uri/ /index_es.html;
}
但是当我尝试访问www.my-domain.com 时,我从 NGINX 得到了一个 403 Forbidden 页面。所以,问题是:
- 为什么我目前需要输入
location = /代码才能使其正常工作? - 如何优化配置以删除
location = /代码?
提前谢谢你。
【问题讨论】:
-
$uri/术语正在寻找一个索引文件,默认为index.html。如果您添加了index index_es.html;,它将按预期工作。 -
@RichardSmith 感谢您的评论。所以...您的意思是删除
location = /部分,然后定义以下内容: location / { try_files $uri $uri/;索引 index_es.html; };对吗?