PHP内置服务器+SSL

6
我知道PHP内置的服务器不支持SSL。是否有其他方法实现呢?
我尝试使用Nginx代理,并将所有HTTPS请求代理到 http://127.0.0.1:8080 ,但是当从 http://127.0.0.1:8080 重定向到 https://127.0.0.1:8080时,会导致重定向循环。请问如何避免这个问题?
server {
    listen       443 ssl;
    server_name  127.0.0.1;

    ssl_certificate     /etc/nginx/cert.crt;
    ssl_certificate_key /etc/nginx/cert.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    location / {
      proxy_pass          http://127.0.0.1:8080;
    }
}

你如何解决这个问题?


1
那肯定是可能的,因为 PHP 部分根本没有进行任何 SSL 处理。不过,https://127.0.0.1:8080 重定向是从哪里来的呢? - halfer
@halfer 基于Symfony的应用程序强制某些URL使用HTTPS。因此,proxy_pass请求被重定向到https,然后再被重定向到http://127.0.0.1:8080等等。 - user1854344
好的,那么深入应用程序并手动将本地主机地址重写为代理端上应用程序的IP/域名。我没有使用过Symfony2,但一定有方法可以做到这一点。您能否在问题中添加执行此操作的代码? - halfer
我想我没有理解你的意思。Symfony是重定向到http://localhost还是https://localhost?如果是后者,则应该由NginX代理提供服务;如果是前者(没有SSL),则Symfony只需要配置将http:替换为https:,并在进行完全限定的重定向时交换端口8080到443(或删除它)。 - halfer
(是的,您不能在此处粘贴整个应用程序,但我想象中有一个中心位置,在该位置您可以在框架或应用程序级别配置根域?) - halfer
显示剩余7条评论
3个回答

2

关于您的nginx,请尝试以下操作:

upstream local8080 {
  server 127.0.0.1:8080;
}
## HTTP CONFIG
server {
  listen 80;
  server_name 127.0.0.1;
  return 301 https://$host$request_uri;
}

## SSL SERVER
server {
  listen 443 ssl http2;
  server_name 127.0.0.1;
  # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
  ssl_dhparam /etc/nginx/ssl/dhparam.pem;

  # modern configuration. tweak to your needs.
  ssl_protocols TLSv1.2 TLSv1.1;
  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
  ssl_prefer_server_ciphers on;

  # OCSP Stapling ---
  # fetch OCSP records from URL in ssl_certificate and cache them
  ssl_stapling on;
  ssl_stapling_verify on;

  resolver 127.0.0.1;

  ssl_certificate /etc/nginx/ssl/localhost.crt;
  ssl_certificate_key /etc/nginx/ssl/private/localhost.key;

location / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass https://local8080;
      root /usr/share/nginx/html;
  }
}

我在本地服务器中使用了上述配置,所以它应该可以工作。但是需要确保SELinux已禁用,并且FirewallD允许端口8080通过。默认情况下,在默认的Linux发行版上,两者都将启用,因此您必须进行更改。
您可以将SSL证书放置在任何位置,然后指向它们。
如果您正在尝试从外部网络访问,则需要在路由器上允许端口8080通过。
如果您需要帮助处理SELinuxFirewallD,请告诉我,我会为您提供代码。如果这是一个本地测试环境,那么只需禁用它们,直到您正确运行nginx

1
不,你引用的是上游,而不是实际的URI。请注意第一行,其中显示了 upstream local8080。上游可以是任何你喜欢的名称。将其称为 localProxy,或代理服务器的名称 localDev0。然后使用上游名称进行引用。 - CodeMilitant

1
代理帮助不大,因为Symfony不知道协议,仍然尝试重定向到https。
尝试使用以下配置。
server {


    listen       443 ssl;
    server_name  127.0.0.1;

    ssl_certificate     /etc/nginx/cert.crt;
    ssl_certificate_key /etc/nginx/cert.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    location / {
        proxy_pass          http://127.0.0.1:8080;
        proxy_redirect      http://localhost:8080 https://127.0.0.1;

        proxy_set_header    Host $host;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto $scheme;
    }
}

1
问题的一部分在于您使用了proxy pass的方式,我认为。
据我所知,您只在443端口上进行监听,因此我甚至认为它不会接受80端口的连接,以便进行代理传递。
其次,我从未见过将proxy pass用于将http重定向到https,但我也不是100%精通nginx或apache,但我通常会使用proxy pass将反向代理的Web请求发送到各种IP的子域和其他目录中。
这篇文章有帮助吗?答案中包含一个配置: nginx force ssl http 请告诉我您发现了什么,我可能稍后有时间测试一下,但如果您只在443端口上进行监听并且将其设置为仅接受ssl,则http请求将简单地失败,并显示服务器无法访问。
如果您确实想让它们能够访问http,但被强制转换到SSL连接,我不知道proxy pass是否是正确的方法。
编辑:

https://serverfault.com/questions/67316/in-nginx-how-can-i-rewrite-all-http-requests-to-https-while-maintaining-sub-dom

这看起来是正确的


代理传递(Proxy pass)在编程中的应用,比如说你有一个主域名叫做domain.com。你可以使用代理传递(Proxy pass)来将对subdomain.domain.com的请求传递到不同的IP地址或服务器上的特定网站目录等。 - wahyzcrak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接