nginx 重写之谜——主机名重复,https 丢失

nginx 重写之谜——主机名重复,https 丢失

我正在开发服务器上用 nginx 替换 lighttpd。我让它与 PHP 和 SSL 一起工作,但我对应该简单的重写感到困惑。我需要重写来自

http[s]://dev.foo.com/signup/123456

http[s]://dev.foo.com/signup/index.php?attcode=123456

我使用的规则是:

rewrite ^/signup/([0-9]+)$  /signup/index.php?attycode=$1 last;

我尝试了多种变化,移动它,将其放在位置块内。结果就是 URL 被重写为:

http://dev.foo.com/dev.foo.com/signup/123456

插入主机名后,好像总是丢失https,转为http。

我的 nginx.com 服务器部分如下。我已阅读并重读 nginx 文档(原样)并搜索了 nginx 邮件列表,但我尝试过的所有方法都无法解决这个问题。

如果有必要的话,请使用 Ubuntu 8.0.4 LTS。

谢谢。


server {
    listen      80;
    listen      443 default ssl;
    server_name dev.foo.com   dev.bar.com   localhost;
    root        /var/www/foo;
    index       index.php index.html;
    # ssl cert stuff omitted
    charset utf-8;
    access_log  /var/log/www/dev.access.log  main;

    location ~ /\. {
        deny  all;
    }   

    location ~* ^.+\.(inc|tpl|sql|ini|bak|sh|cgi)$ {
        deny all;
    }   

    location ~* ^/(scripts|tmp|sql)/ {
        deny all;
    }   

    rewrite ^/robots.txt$         /robots_nocrawl.txt break;
    rewrite ^/signup/([0-9]+)$    /signup/index.php?attycode=$1 last;

    location / { 
        try_files $uri $uri/ /error_404.php;
    }   

    location ~ \.php$ {
        fastcgi_pass localhost:51115;
        fastcgi_index index.php;
        fastcgi_intercept_errors on; 
        include fastcgi_params;
        fastcgi_param SERVER_NAME       $http_host;
        fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    }

    error_page  404              /error_404.php;
}

答案1

尝试:

rewrite ^/signup/([0-9]+)$  https://$server_namesignup/index.php?attycode=$1 last;

如果它来自 HTTP,那么 nginx 将尝试将其推回 HTTP,并且我认为除非您指定协议,否则它也会默认重写为 HTTP。

答案2

location /signup/ {
     rewrite ^/signup/([0-9]+)$ /signup/index.php?attcode=$1 break;
}

或者

location ~ ^/signup/([0-9]+)$ {
     rewrite ^ /signup/index.php?attcode=$1 break;
}

或者如果你确实想重定向:

location ~ ^/signup/([0-9]+)$ {
     return 301 $scheme://$server_name/signup/index.php?attcode=$1
}

相关内容