wordpress nginx ssl loop de redirecionamento

4

Então, estou configurando um servidor nginx e instalei o wordpress e o SSL.

O site está funcionando perfeitamente em http e https, mas quando tento redirecionar http para https através do bloco de servidor do nginx, tanto o http quanto o https resultam em um loop de redirecionamento sem fim.

Aqui está o meu bloco de servidores

    server {
    listen 80;
    return         301 $server_name$request_uri;
    listen 443 ssl spdy;
    root /var/www/wordpress;
    index index.php index.html index.htm;
    server_name www.example.com;
    ssl_session_cache shared:SSL:20m;
    ssl_session_timeout 10m;
    spdy_headers_comp 6;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_certificate /etc/ssl/certs/www.example.com.certchain.crt;
    ssl_certificate_key /etc/ssl/private/www.example.com.key;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
    add_header        Alternate-Protocol  443:npn-spdy/2;
    proxy_set_header X-Forwarded-Proto https;

    access_log   /var/log/nginx/example.com.access.log;
    error_log    /var/log/nginx/example.com.error.log;

    error_page 404 /404.html;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
            root /usr/share/nginx/html;
    }


location / {
            proxy_set_header        X-Forwarded-Proto $scheme;
            # try_files $uri $uri/ =404;
            try_files $uri $uri/ /index.php?q=$uri&$args;
    if ($http_referer ~* (buttons-for-website.com)) { return 444; }
    if ($http_referer ~* (semalt.com)) { return 444; }
    }


    location ~ \.(hh|php)$ {
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Ssl on;
        fastcgi_keep_conn on;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;
    fastcgi_cache microcache;
    fastcgi_cache_valid 200 60m;

 }

  location ~ \.php$ {

  location @fallback {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache microcache; fastcgi_cache_valid 200 60m;

 }

 # Cache Static Files For As Long As Possible
location ~*
 \.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|$
{
  access_log off;
  log_not_found off;
  expires max;
   }
# Security Settings For Better Privacy Deny Hidden Files
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# Return 403 Forbidden For readme.(txt|html) or license.(txt|html)
if ($request_uri ~* "^.+(readme|license)\.(txt|html)$") {
 return 403;
}
# Disallow PHP In Upload Folder
location /wp-content/uploads/ {
location ~ \.php$ {
deny all;
}
}
}

Eu realmente aprecio a ajuda de ninguém. Eu comentei que "return 301" na terceira linha e no google indexado tanto http e https versão da mesma página e deindexed a maioria das minhas páginas e caiu rankings para várias palavras-chave.

Obrigado um monte de antecedência!

    
por ec2geek 30.12.2014 / 03:38

1 resposta

8

Quando o Nginx processa uma solicitação, primeiro identifica o bloco do servidor que manipulará a solicitação. Isso significa que ele corresponderá às diretivas server_name e listen.

No seu caso, o bloco de servidor único que você contém contém:

server {
    listen 80;
    return 301 $server_name$request_uri;
    listen 443 ssl spdy;
    root /var/www/wordpress;
    index index.php index.html index.htm;
    server_name www.example.com;
    ...

Isso escutará na porta 80 e 443. O fato de você ter uma diretiva de retorno entre os dois não importa, já que a diretiva de retorno não é processada neste ponto.

Assim que o bloco do servidor for correspondido, o Nginx passará a processar outras diretivas. No caso das diretivas de reescrita (por exemplo, retorno), elas são processadas no pedido listado . No caso das diretrizes de localização, elas são processadas com base na especificidade da correspondência (as regras exatas são listadas aqui ).

Para implementar seu redirecionamento, você deve separar sua diretiva de reescrita em um bloco de servidor separado:

server {
    listen 80;
    server_name www.example.com;
    return 301 https://www.example.com$request_uri;
}

server {
    listen 443 ssl spdy;
    server_name www.example.com;
    root /var/www/wordpress;
    index index.php index.html index.htm;
    ...
}

Observe que você precisa especificar que está retornando a versão HTTPS e não a mesma versão (HTTP) da página. Em alguns casos, pode ser preferível codificar o nome do servidor (por exemplo, se você quiser redirecionar o tráfego www e não www para a mesma página HTTPS).

Editar: para endereçar seu comentário:

Você quer conteúdo veiculado de https://www.example.com e deseja os seguintes redirecionamentos:

  • http://(www.)?example.com redireciona para https://www.example.com
  • https://example.com redireciona para https://www.example.com

Para fazer isso, você precisa de três blocos de servidores:

server { #Redirect non-https to https - match both www and non-www
    listen 80;
    server_name  www.example.com example.com;
    return 301 https://www.example.com$request_uri;
}

server { #Redirect https, non-www to https, www
    listen 443 ssl spdy;
    server_name example.com;
    ssl_certificate /etc/ssl/certs/www.example.com.certchain.crt;
    ssl_certificate_key /etc/ssl/private/www.example.com.key;
    return 301 https://www.example.com$request_uri;
}

server { #Main server block
    listen 443 ssl spdy;
    server_name www.example.com;
    root /var/www/wordpress;
    index index.php index.html index.htm;
    ssl_certificate /etc/ssl/certs/www.example.com.certchain.crt;
    ssl_certificate_key /etc/ssl/private/www.example.com.key;

    ...

}

Alguns pontos importantes de menção:

  1. Seu certificado SSL deve listar www.example.com e example.com como nomes alternativos de assunto. Mesmo que você esteja redirecionando para longe de example.com, uma conexão SSL ainda é estabelecida antes do redirecionamento. Sem um certificado válido para example.com, o usuário receberá um aviso de certificado inválido e o redirecionamento não ocorrerá. (Isso também implica que você deve incluir o certificado no bloco link )

  2. Como ter um redirecionamento requer vários bloqueios de servidor SSL, é preferível mover parte de sua configuração SSL para fora do bloco do servidor (no bloco http). Isso inclui: ssl_session_timeout , ssl_session_cache , ssl_protocols , ssl_ciphers , ssl_prefer_server_ciphers , ssl_stapling , ssl_stapling_verify , ssl_trusted_certificate , ssl_dhparam e seu cabeçalho HSTS. (Como um aparte, eu recomendo olhar pela página TLS do servidor da Mozilla )

por 30.12.2014 / 04:03