我正在用nginx反向代理和gunicorn应用程序服务器开发一个Django应用程序。 作为一个新手的Web开发人员,我需要帮助redirect到no www服务器级别的wwwstream量。 我目前在应用程序中的中间件级别做同样的事情,但需要提高性能。
目前我的nginx虚拟主机文件的布局如下:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=100m inactive=6m; upstream my_server { server unix:/home/myuser/myproject/myfolder/myproject.sock fail_timeout=0; } server { listen 80; server_name example.com www.example.com; # a bunch of 'location' blocks eg 'location /' or 'location @http_proxy_to_app', etc. } server { listen 443 ssl; server_name example.com www.example.com; # SSL related stuff # a bunch of 'location' blocks eg 'location /' or 'location @http_proxy_to_app', etc. }
在这种情况下,我将如何将wwwredirect到no-www ? 我见过的大部分示例都解释说我需要在顶部添加一个专用server块,如下所示:
server { server_name www.example.com; return 301 $scheme://example.com$request_uri; }
其他build议一直在我的服务器块(内部location / )内包含如下内容。 我不确定这是否与反向代理相关的代码兼容:
if ($host ~* ^www\.(.*)$) { rewrite / $scheme://$1 permanent; }
作为一个新手,我想确认哪个练习使用(以及为什么)给出了我的nginx文件目前的布局,因此这个问题。
这是我的实际configuration看起来像:
server { server_name example.com; listen 443 ssl; #ssl_certificate /etc/ssl/certs/ssl-bundle.crt; ssl_certificate /etc/nginx/ssl/cert_chain.crt; #ssl_certificate_key /etc/ssl/myserver.key; ssl_certificate_key /etc/nginx/ssl/server.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; #ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; #ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5; ssl_session_cache shared:SSL:1250m; ssl_session_timeout 180m; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_stapling on; ssl_stapling_verify on; #ssl_trusted_certificate /etc/ssl/COMODO_DV_SHA-2_under_SHA-2root.crt; ssl_trusted_certificate /etc/nginx/ssl/example_com.ca-bundle; # write error log file for https errors: error_log /var/log/nginx/https-error_log warn; location ~* \.(?:ico|css|js|gif|jpe?g|png)$ { root /home/myuser/myproj/myapp; expires 24h; add_header Vary Accept-Encoding; access_log off; } .... more config to follow ... }
处理http://example.com,https://example.com,http : //www.example.com和https://www.example.com的Web服务器的首选设置如下example.com域名和https是首选:
server { server_name example.com www.example.com; listen 80; return 301 https://example.com$request_uri; } server { server_name www.example.com; listen 443 ssl; return 301 https://example.com$request_uri; } server { server_name example.com; listen 443 ssl; ... actual server configuration ... }
在这种设置中,只有一个实际的URL https://example.com用于访问网站内容,这对于build立索引非常有用。 在您当前的设置中,所有url都提供相同的网站内容,这会导致与Google存在重复问题。
为redirect定义单独的虚拟主机是首选方法,因为评估if语句会导致已经进入正确虚拟主机块的请求发生重复工作。