Nginx

讓 nginx 將所有內容重定向到 https,除了一個目錄

  • July 10, 2021

我需要 nginx 將所有 http URL 重定向到 https,但“.secret/”目錄除外,該目錄應繼續用作 http。

因此,例如:

  • http://example.com/a.html–>https://example.com/a.html
  • http://example.org/z/b.html–>https://example.org/z/b.html
  • http://example.com/.secret/x.html–>http://example.com/.secret/x.html

我的配置中有以下內容,但對於 http,它返回包含“_”的地址。

server {
   listen 80;

   server_name _;

   location /.secret {
       return http://$server_name$request_uri;
   }

   location / {
       return 301 https://$server_name$request_uri;
   }
}

我究竟做錯了什麼?

更新:

結合來自@mforsetti 和@Pothi_Kalimuthu 的評論,以下工作有效:

server {
   listen 80;

   server_name _;

   location /.secret { }

   location / {
       return 301 https://$host$request_uri;
   }
}

它返回包含“_”的地址。

server_name _;

location /.secret {
   return http://$server_name$request_uri;
}

$server_name返回分配server_nameserver塊,在你的情況下是_; 因此_返回的地址。

如果您希望它返回主機名或Host請求標頭,請嘗試使用$host,例如:

location /.secret {
   return http://$host$request_uri;
}

.secret/應該繼續作為 http 服務的目錄

如果要提供目錄,請指定一個root目錄。

location /.secret {
   root /path/to/your/parent/of/secret/directory;
}

引用自:https://serverfault.com/questions/1069186