【问题标题】:Nginx exception to rewrite ruleNginx 异常重写规则
【发布时间】:2014-09-26 06:08:34
【问题描述】:

我的公司正在使用 nginx 运行网络服务器。设置了配置,以便使用位置块将某个服务器块上的每个请求强制重写为 https。这是特定域的完整配置:

# HTTP server

server {
    listen       80;
    server_name  www.mydomain.it mydomain.it admin.mydomain.it;
    rewrite ^(.*) https://$host$1 permanent;
}

# HTTPS server

server {
    listen       443;
    server_name  www.mydomain.it mydomain.it admin.mydomain.it;
    root         /usr/share/nginx/html/mydomain_server;

    ssl                   on;
    ssl_certificate       /etc/certs/mydomain-bundle.crt;
    ssl_certificate_key   /etc/certs/mydomain.key;

    ssl_session_timeout  5m;

    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    access_log  /var/log/nginx/mydomain.ssl.access.log  main;
    error_log   /var/log/nginx/mydomain.ssl.error.log   error;

    location / {
            try_files $uri $uri/ =404;
    }

    error_page 404 /404-mydomain.html;
    error_page 500 502 503 504 /50x.html;

    location ~ \.php$ {
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

此域为不同客户提供同一软件的多个实现,其工作方式如下:

Customer John: www.domain.com/John
Customer Ada: www.domain.com/Ada
etc...

显然,如您所见,对此类 URL 的所有访问都被重定向到 HTTPS。

现在,特别需要单个客户,而不是这种情况。

我一直在阅读有关位置的官方文档 here,它告诉我不能不匹配特定的表达式(如 here too 所述),我找不到让它工作的方法。

我尝试在默认路径之前添加另一个与客户路径匹配的位置块,如下所示:

server {
    listen       80;
    server_name  www.mydomain.it mydomain.it admin.mydomain.it;
    root         /usr/share/nginx/html/mydomain_server;

    location ^~ /Mole/ {
            try_files $uri $uri/ =404;
    }

    location / {
            rewrite ^(.*) https://$host$1 permanent;
            try_files $uri $uri/ =404;
    }    
}

这不起作用,因为 Mole 仍被重定向到 HTTPS。我试过使用“~”、“=”甚至简单的“location /Mole/”,但没有成功。不是浏览器缓存问题,因为我已经尝试过刷新它。我错过了什么?

【问题讨论】:

  • 你检查过 curl/wget 吗?你有永久重定向,你的浏览器可能缓存了它。
  • 正如最后所说,我检查了。尝试使用具有匿名会话/刷新缓存的不同浏览器。
  • 缓存与 301 无关。浏览器历史记录是。在您的历史记录窗口中,右键单击该站点的条目并查找“忘记此站点”选项。这也应该清除您可能设置的任何严格传输安全标头。并且总是尝试使用 curl,浏览器不可靠 - 隐藏的功能太多。但是你的错误很可能是你的 server 块中没有定义 webroot,那么 try_files 匹配的是什么?
  • @Melvyn,虽然我忘了提,但我复制了“root /usr/share/nginx/html/mydomain_server;”普通 http 服务器块中的行。关于 curl 的测试,我会尽快尝试。

标签: nginx


【解决方案1】:

您可以尝试使用 map 指令来识别更喜欢使用 http 的客户:

map $uri $use_https {
    default 1;
    ~^/Mole/ 0; # add other exceptions as needed
}

server {
    listen  80;
    server_name  www.mydomain.it mydomain.it admin.mydomain.it;
    root    /usr/share/nginx/html/mydomain_server;

    location / {
        if ($use_https) { # consider using 302 for testing
            return 301 https://$host$request_uri;
        }
        try_files $uri $uri/ =404;
    }
}

【讨论】:

  • 像魅力一样工作。鼹鼠(虽然不是真实客户的名字)会很开心!谢谢。
猜你喜欢
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 2013-08-05
  • 2013-10-12
相关资源
最近更新 更多