我有以下nginx配置片段:
server {
listen 80;
server_name mydomain.io;
root /srv/www/domains/mydomain.io;
index index.html index.php;
access_log /var/log/nginx/domains/mydomain.io/access.log;
error_log /var/log/nginx/domains/mydomain.io/error.log;
location ~\.php {
try_files $uri =404;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
fastcgi_pass 127.0.0.1:9000;
include /etc/nginx/fastcgi_params;
}
}
首先,如何让服务器块响应both
http://www.mydomain.io和http://mydomain.io。其次,如果他们来自http://www.mydomain.io,我想强制重定向到http://mydomain.io。
感谢。
答案 0 :(得分:156)
根据https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#server-name-if,你应该使用:
server {
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
server_name example.com;
# [...]
}
答案 1 :(得分:12)
我认为最好添加两个单独的服务器块,以避免if
块进行不必要的检查。我还使用$ scheme变量,这样就不会将HTTPS请求重定向到不安全的对应项。
server {
listen 80;
server_name www.mydomain.io;
rewrite ^ $scheme://mydomain.io$uri permanent;
}
server {
listen 80;
server_name mydomain.io;
# your normal server block definitions here
}
答案 2 :(得分:2)
另一种编码方式:
if ($http_host ~* "^www\.(.+)$"){
rewrite ^(.*)$ http://%1$request_uri redirect;
}
即使在同一代码上使用多个域名也能正常工作。
答案 3 :(得分:1)
对于通用方法,我不必提及任何特定的域或协议,我已经非常成功地使用了它:
# rewrite to remove www.
if ( $host ~ ^www\.(.+)$ ) {
set $without_www $1;
rewrite ^ $scheme://$without_www$uri permanent;
}
这将重定向:https://www.api.example.com/person/123?q=45 到https://api.example.com/person/123?q=45
答案 4 :(得分:-1)
server {
listen 80;
server_name www.mydomain.io;
return 301 https://$host$request_uri;
}
server {
listen 80;
server_name mydomain.io;
...
}
答案 5 :(得分:-19)
关于第一个问题 - 只需添加两个域:
server_name mydomain.io www.mydomain.io;
对于第二个,你需要这个简单的重定向:
server {
listen 80;
server_name www.mydomain.io mydomain.io;
if ($host = 'www.mydomain.io' ) {
rewrite ^/(.*)$ http://mydomain.io/$1 permanent;
}