我在同一主机上有http://和https://,如下所示:
server {
listen 80;
listen 443 ssl;
...
...
}
我需要做的是将访问我店铺的用户重定向到https://。问题是我有很多语言:
https://mydomain.com/的 EN /店铺 https://mydomain.com/的 FR /店铺 等...
我尝试了这个并且它无效(nginx: configuration file /etc/nginx/nginx.conf test failed)
:
if ($server_port = 80) {
location (en|fr)/shop {
rewrite ^ https://$host$request_uri permanent;
}
}
答案 0 :(得分:47)
进行301重定向而不是使用if语句(参见http://wiki.nginx.org/Pitfalls上的服务器名称),这也是NGINX的最佳做法。我创建了一个带有为SSL,Rails和Unicorn配置的nginx.conf的要点
https://gist.github.com/Austio/6399964
以下是您的相关部分。
server {
listen 80;
server_name domain.com;
return 301 https://$host$request_uri;
}
答案 1 :(得分:11)
或者更好的是,避免使用硬编码的服务器名称
server {
listen 80;
rewrite (.*) https://$http_host$1 permanent;
}
答案 2 :(得分:6)
为了使用正则表达式匹配location
,您需要在表达式前加上~
或~*
:
if ($server_port = 80) {
location ~ (en|fr)/shop {
rewrite ^ https://$host$request_uri permanent;
}
}
要使用正则表达式,必须使用前缀:
"~"
用于区分大小写的匹配- 醇>
"~*"
用于不区分大小写的匹配
由于nginx不允许location
块嵌套在if
块内,因此请尝试以下配置:
if ($server_port = 80) {
rewrite ^/(en|fr)/shop https://$host$request_uri permanent;
}
答案 3 :(得分:2)
理想情况下,在保留尾随路径时避免使用if语句:
server {
listen 80;
server_name example.com;
rewrite (.*) https://example.com$1 permanent;
}
永久负责301。
答案 4 :(得分:2)
另一种方法是使用error_page 497
server {
listen 80;
listen 443;
ssl on;
error_page 497 https://$host$request_uri;
ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
...