nginx: rediriger tout de http vers https, sauf un url-pattern

J'ai un site web qui ne devrait être accessible que via HTTPS sauf un URL-pattern (parce que j'ai sur certaines pages http-iframe et je voudrais éviter les avertissements de sécurité)

E.g. this pages should be redirected to https:
http://example.com
http://example.com/a/this-is-an-article
http://example.com/v/this-is-a-video

This pages should not be redirected to https (or should be redirected form https to http)
http://example.com/l/page-with-unsafe-iframe
http://example.com/l/other-page-with-unsafe-iframe
30
demandé sur tiefenb 2015-01-09 12:24:35

2 réponses

Si les pages iframe sont toujours dans le même répertoire, des emplacements de préfixe simples peuvent être utilisés.

server {
    listen 443;

    location /l/ {  # redirect https iframe requests to http server
        return 301 http://$server_name$request_uri;
    }
    # ...
}

server {
    listen 80;

    location / {  # the default location redirects to https
        return 301 https://$server_name$request_uri;
    }

    location /l/ {}  # do not redirect requests for iframe location
    # ...
}
48
répondu Cole Tierney 2015-01-09 17:47:16

Vous pouvez utiliser map et des règles de redirection simples, par exemple:

map $uri $redirect_https {
    /l/page-with-unsafe-iframe         0;
    /l/other-page-with-unsafe-iframe   0; # you can use regex here
    default                            1;
}

server {
    listen 443;

    if ($redirect_https = 0) {
       return 301 http://$server_name$request_uri;
    }

    # other code
}
server {
    listen 80;

    if ($redirect_https = 1) {
       return 301 https://$server_name$request_uri;
    }

    # other code
}

Je dois mentionner que la redirection 301 est une bonne pratique contrairement à la réécriture permanente.

11
répondu Dmitriy Z 2017-04-06 15:56:48