Nginx配置:if not iPhone/iPad then 301 redirect to https
Nginx configure: if not iPhone/iPad then 301 redirect to https
我将我的网站升级到带有 startssl 认证的 https。
但是 Safari 不信任 startssl 认证。
所以,我考虑设置nginx,如果是http,并且UserAgent不包含iPhone/iPad,那么301重定向到https。(意思是其他浏览器会301到https。)
这是我试过的:
server {
listen 80;
listen 443 ssl;
server_name abc.com alias abc.com;
ssl_certificate D:\cert_abc.com_bundle.crt;
ssl_certificate_key D:\cert\abc.com.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
if ($scheme = http) && if ($http_user_agent !~* iPhone|iPad) {
return 301 https://$host$request_uri;
}
location / {
root D:/www;
index index.html index.htm default.html default.htm index.php;
include D:/www/up-*.conf;
}
========或==========
if ($scheme = http && $http_user_agent !~* iPhone|iPad)
========或==========
但是两者都没有效果
if
指令只能包含简单的条件。有关详细信息,请参阅 this document。
一种方法是将 http
和 https
服务器分成单独的 server
块。
server {
listen 80;
server_name abc.com alias abc.com;
if ($http_user_agent !~* "iPhone|iPad") {
return 301 https://$host$request_uri;
}
include path/to/common/config;
}
server {
listen 443 ssl;
server_name abc.com alias abc.com;
ssl_certificate D:\cert_abc.com_bundle.crt;
ssl_certificate_key D:\cert\abc.com.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
include path/to/common/config;
}
它确实涉及在两个 server
块之间复制通用配置,但是,include
指令可用于将任何通用配置卸载到单独的文件中(如上所示)。
更好的解决方案是 front-end 重定向:
在 http 网页中,包含一个位于 https 版本的 js 文件,它只做一件事:重定向到相同的 url 但使用 https。因此只有信任您的证书的客户端才会被重定向。
但无论采用何种解决方案,如果用户获得 https link,如果他们不信任该证书,该解决方案就会被破坏。我希望您不要处理任何个人数据,因为您有义务保护这些数据,即使是使用 iPad 的人也是如此。
当然,更好的解决方案可能是使用受信任的证书,例如让我们加密。
我将我的网站升级到带有 startssl 认证的 https。 但是 Safari 不信任 startssl 认证。 所以,我考虑设置nginx,如果是http,并且UserAgent不包含iPhone/iPad,那么301重定向到https。(意思是其他浏览器会301到https。) 这是我试过的:
server {
listen 80;
listen 443 ssl;
server_name abc.com alias abc.com;
ssl_certificate D:\cert_abc.com_bundle.crt;
ssl_certificate_key D:\cert\abc.com.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
if ($scheme = http) && if ($http_user_agent !~* iPhone|iPad) {
return 301 https://$host$request_uri;
}
location / {
root D:/www;
index index.html index.htm default.html default.htm index.php;
include D:/www/up-*.conf;
}
========或==========
if ($scheme = http && $http_user_agent !~* iPhone|iPad)
========或==========
但是两者都没有效果
if
指令只能包含简单的条件。有关详细信息,请参阅 this document。
一种方法是将 http
和 https
服务器分成单独的 server
块。
server {
listen 80;
server_name abc.com alias abc.com;
if ($http_user_agent !~* "iPhone|iPad") {
return 301 https://$host$request_uri;
}
include path/to/common/config;
}
server {
listen 443 ssl;
server_name abc.com alias abc.com;
ssl_certificate D:\cert_abc.com_bundle.crt;
ssl_certificate_key D:\cert\abc.com.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
include path/to/common/config;
}
它确实涉及在两个 server
块之间复制通用配置,但是,include
指令可用于将任何通用配置卸载到单独的文件中(如上所示)。
更好的解决方案是 front-end 重定向:
在 http 网页中,包含一个位于 https 版本的 js 文件,它只做一件事:重定向到相同的 url 但使用 https。因此只有信任您的证书的客户端才会被重定向。
但无论采用何种解决方案,如果用户获得 https link,如果他们不信任该证书,该解决方案就会被破坏。我希望您不要处理任何个人数据,因为您有义务保护这些数据,即使是使用 iPad 的人也是如此。
当然,更好的解决方案可能是使用受信任的证书,例如让我们加密。