我一直在苦苦寻找解决我遇到的问题的方法: 我需要将所有http请求重定向到https,除了特定位置下的特定页面。 我有以下内容:
server {
listen 80;
listen 443 ssl;
server_name myserver;
root /var/www/example.org/htdocs;
index index.html;
.
.
}
我无法使用:
server {
listen 80;
server_name my.domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name my.domain.com;
.
.
}
我在here
中找到了一个很好的解决方案解决方案的问题在于重定向进入了一个不定式循环,解决方案就像我的更改之后的那样:
map $uri $example_org_preferred_proto {
default "https";
~^/post/ "http";
}
server {
listen 80;
listen 443 ssl;
server_name example.org;
root /var/www/example.org/htdocs;
if ($example_org_preferred_proto = "https") {
return 301 $example_org_preferred_proto://example.org$request_uri;
}
}
我理解问题的逻辑:
我收到的请求如下:http://wwww.example.com/test - >重定向到https://wwww.example.com/test
现在我收到了一个请求:https://wwww.example.com/test - >重定向到https://wwww.example.com/test
现在我收到了一个请求:https://wwww.example.com/test - >重定向到https://wwww.example.com/test并进入循环....
我需要一种方法在重定向一次后停止。
答案 0 :(得分:1)
server {
listen 80;
server_name wwww.example.com;
root /var/www/example.org/htdocs;
location /test {
try_files $uri $uri/ =404;
}
location / {
return 301 https://$server_name$request_uri;
}
}
server {
listen 443 ssl;
## here goes other ssl staff which you can find by link:
## https://gist.github.com/paskal/628882bee1948ef126dd
server_name example.org;
root /var/www/example.org/htdocs;
location /test {
try_files $uri $uri/ =404;
}
location / {
return 301 https://$server_name$request_uri;
}
}
最佳解决方案是最简单的解决方案。您只需要提供一个位置并重定向其他任何内容 - 这样做。 如果您在使用两个服务器块时遇到问题,请详细说明。