我们有一个 C# .Net Core 3.1 应用程序,它托管一个网站(所有配置都在 Program.cs 和 Startup.cs 中),它在 Windows 上运行良好。它已设置,因此欢迎页面显示在https://ip/产品名称而不是直接https://ip/。不幸的是,我们似乎无法使用 kestrel .Net Core 代码以相同的方式进行设置,并且已将其设置为监听http://本地主机:5000/。
我对这个问题的解决方案是设置 NGINX 将所有请求从 HTTP 重定向到 HTTPS,并将请求从位置 /ProductName 重定向到 127.0.0.1:5000。这在运行此程序的生产设备上效果很好,但我似乎无法让它在适用于 Linux 的 Windows 子系统上运行(这样开发人员就不需要物理设备来调试/测试内容了)。
这是我们在生产设备中使用的 nginx.conf,也是我尝试用于 WSL 的 nginx.conf:
user www-data;
worker_processes 1;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
http {
sendfile on;
keepalive_timeout 65;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# Redirect All HTTP to HTTPS
server {
listen 8080 default_server;
server_name _;
return 301 https://$host$request_uri;
}
# HTTPS server
#
server {
listen 8443 ssl;
server_name localhost;
ssl_certificate /path/to/my/server.crt;
ssl_certificate_key /path/to/my/server.key;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
root /path/to/my/wwwroot;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://127.0.0.1:5001;
}
location /ProductName/ {
proxy_pass http://127.0.0.1:5000/;
}
}
}
请注意,我们没有在或中包含任何文件/etc/nginx/conf.d/
,/etc/nginx/sites-enabled/
也没有/etc/nginx/modules-enabled/
任何其他 conf 文件。
此文件(用于 WSL)与生产文件之间的一个主要区别是,我们使用端口 8080 和 8443 而不是 80 和 443,因为当它尝试绑定到端口 80 时,我不断收到权限被拒绝错误,即使我使用 sudo 启动 NGINX 服务。
当我使用此文件启动 NGINX 服务时,我无法使用http://127.0.0.1/产品名称(我认为这是可行的,因为它应该被重定向到 HTTPS,然后按照我的第二条规则重定向到http://127.0.0.1:5000/我的程序正在监听它),也不使用https://127.0.0.1/产品名称。 我可以仅有的通过访问http://127.0.0.1:5000/,就好像 NGINX 服务根本没有运行一样。
我曾尝试在 Google 上搜索如何在 WSL 上设置 NGINX,发现有些人说它应该按原样工作,与“真正的” Linux 设置相比,不需要任何其他额外的技巧或配置。
为了实现这个功能我缺少什么?
答案1
为了实现这个功能我缺少什么?
从 80 和 443 到 8080 和 8443 的变化可能是这里的罪魁祸首。
使用http://127.0.0.1/ProductName
和https://127.0.0.1/ProductName
通常分别相当于使用http://127.0.0.1:80/ProductName
和https://127.0.0.1:443/ProductName
(也就是说,例如浏览器假定使用这些标准端口,以便人们不必为每个 Web 请求都指定它们)。
尝试使用http://127.0.0.1:8080/ProductName
和https://127.0.0.1:8443/ProductName
看看它们是否有效。如果有效,那么您可能需要解决端口冲突或想出另一个您可以接受的解决方案。