我试图让Nginx重写传入的请求到我的服务器前缀https://到http:// (这是因为在此站点上使用的CMS强制URI而不是相对path – 本质上打破了整个网站通过使图像,脚本和样式表不可用)。
我目前正在尝试改造由前任设置的现有指令,但是我发现自己受限于我对Nginxconfiguration语法的了解。 代码如下:
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的答案添加代码; 然而,这种无条件的重写会导致redirect循环。 帮助仍然感激。
更清洁的方式是:
if ( $scheme = "https" ) { return 301 http://example.com$request_uri
或者在这和Nathans之间的某个地方回答,你的默认SSL服务器块只包含return 301 (不pipe是哪个ssl块,你必须仔细看看你的实现和适应)。为一个简单的redirect
return – http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return
编辑:我只是注意到有一个variables$https可以在if语句中使用。 如果不是https :
if ( $https = "on" ) { ...
请记住,在testing更改时,您应该使用302临时redirect而不是301永久性,以便在发现您在一个小时之前修复它时保存头发,但这些更改未反映在浏览器中:)
你甚至不需要这个,因为你可以强制所有的httpsstream量去像这样的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