我正在尝试让 Nginx 重写对我的服务器以 to 为前缀的站点的传入请求https://
(http://
这是因为该站点上使用的 CMS 强制使用 URI 而不是相对路径——本质上是通过使图像、脚本和样式表不可用来破坏整个站点)。
我目前正在尝试改造前任制定的现有指令,但我发现自己对 Nginx 配置语法的了解有限。以下是代码:
if ($ssl_protocol = "") {
rewrite ^ https://$http_host$request_uri? permanent;
}
我目前已注释掉此代码以防止强制重写http://
,https://
但我无法在不破坏网站的情况下逆转该过程。以下是我迄今为止尝试过的方法:
if ($ssl_protocol = "https") {
rewrite ^ http://$http_host$request_uri? permanent;
}
和
# also tried ($ssl_protocol != "")
if (!($ssl_protocol = "")) {
rewrite ^ http://$http_host$request_uri? permanent;
}
第一个似乎没有效果。发送到客户端的 HTML 仍然会发出未被重写的 HTTPS 请求。
第二个代码片段似乎也没有任何效果 - 如果我理解正确的话(尽管我仍然有点惊讶),Nginx 不支持布尔否定。
实现这一目标的最佳方法(或有效方法)是什么?
编辑:我尝试添加@NathanC 答案中的代码;但是,这种无条件重写会导致重定向循环。仍希望得到帮助。
答案1
更清洁的方法是:
if ( $scheme = "https" ) {
return 301 http://example.com$request_uri
或者介于此和 Nathans 的回答之间,其中默认 SSL 服务器块仅包含return 301
(无论是哪个 SSL 块,您都必须仔细查看您的 SSL 块以了解其如何实现和适应)没有必要为简单的重定向执行正则表达式
return
-http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return
编辑:我刚刚注意到有一个变量$https
可以在 if 语句中使用。" "
如果不是 https 则返回:
if ( $https = "on" ) {
...
请记住,在测试更改时,您应该使用302
临时重定向而不是301
永久重定向,以便在您发现一小时前修复了它但更改没有反映在您的浏览器中时节省时间:)
答案2
你甚至不需要这个,因为你可以强制所有 https 流量转到 http,就像这样:
server {
listen 443;
ssl on;
server_name example.com;
rewrite ^(.*) http://example.com$1 permanent;
}
参考:https://stackoverflow.com/questions/3470290/nginx-redirect-https-to-http