我想将我的 Web 服务器上的所有 http 请求重写为 https 请求,我从以下内容开始:
服务器 {
听80;
地点 / {
重写 ^(.*) https://mysite.com$1 永久;
}
...
一个问题是这会剥离任何子域信息(例如,node1.mysite.com/folder),我如何重写上述内容以将所有内容重新路由到 https 并维护子域?
我刚刚在我的服务器上安装了 SSL 证书。
然后它在端口 80 上为我的域上的所有流量设置重定向,以将其重定向到端口 443。
换句话说,我所有的http://example.com流量现在都被重定向到https://example.com页面的适当版本。
重定向是在我的 Apache Virtual Hosts 文件中完成的,内容如下...
RewriteEngine on
ReWriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]
Run Code Online (Sandbox Code Playgroud)
我的问题是,使用 SSL 有什么缺点吗?
由于这不是 301 重定向,我是否会因为切换到而失去搜索引擎中的链接汁/排名https?
我很感激你的帮助。一直想在服务器上设置SSL,只是为了实践一下,今晚终于决定做了。到目前为止,它似乎运行良好,但我不确定在每个页面上都使用它是否是个好主意。我的网站不是电子商务网站,也不处理敏感数据;它主要是为了外观和安装它进行学习的快感。
更新的问题
奇怪的是,Bing 从我的网站创建了这个屏幕截图,因为它在任何地方都使用 HTTPS...
有没有办法在两个 nginxserver {}块之间共享配置指令?我想避免重复规则,因为我网站的 HTTPS 和 HTTP 内容使用完全相同的配置。
目前,它是这样的:
server {
listen 80;
...
}
server {
listen 443;
ssl on; # etc.
...
}
Run Code Online (Sandbox Code Playgroud)
我可以做一些类似的事情:
server {
listen 80, 443;
...
if(port == 443) {
ssl on; #etc
}
}
Run Code Online (Sandbox Code Playgroud) 我正在与 Apache2 和Passenger 合作进行Rails 项目。我想创建一个用于测试目的的自签名SSL 证书。
sudo openssl rsa -des3 -in server.key -out server.key.new
Run Code Online (Sandbox Code Playgroud)
当我输入上述命令时,它说
writing RSA key
Enter PEM pass phrase:
Run Code Online (Sandbox Code Playgroud)
如果我不输入密码,我会收到以下错误
unable to write key
3079317228:error:28069065:lib(40):UI_set_result:result too small:ui_lib.c:869:Yo
u must type in 4 to 1024 characters
3079317228:error:0906406D:PEM routines:PEM_def_callback:problems getting passwor
d:pem_lib.c:111:
3079317228:error:0906906F:PEM routines:PEM_ASN1_write_bio:read key:pem_lib.c:382
Run Code Online (Sandbox Code Playgroud)
是否可以在不提供 RSA 密钥的情况下生成 RSA 密钥pass phrase,因为我不确定/etc/init.d/httpd脚本将如何在没有人工干预的情况下启动 HTTP 服务器(即,如果我提供 4 个字符的密码短语,它希望我在启动 Apache HTTP 服务器时提供它)。
假设一个网站在多个服务器之间进行负载平衡。我想运行一个命令来测试它是否正常工作,例如curl DOMAIN.TLD. 因此,为了隔离每个 IP 地址,我手动指定了 IP。但是很多网站可能托管在服务器上,所以我还是提供了一个主机头,像这样:curl IP_ADDRESS -H 'Host: DOMAIN.TLD'. 在我的理解中,这两个命令创建了完全相同的 HTTP 请求。唯一的区别是,在后一个中,我从 cURL 中取出 DNS 查找部分并手动执行此操作(如果我错了,请纠正我)。
到目前为止一切顺利。但现在我想对 HTTPS 网址做同样的事情。同样,我可以像这样测试它curl https://DOMAIN.TLD。但我想手动指定 IP,所以我运行curl https://IP_ADDRESS -H 'Host: DOMAIN.TLD'. 现在我收到一个 cURL 错误:
curl: (51) SSL: certificate subject name 'DOMAIN.TLD' does not match target host name 'IP_ADDRESS'.
Run Code Online (Sandbox Code Playgroud)
我当然可以通过告诉 cURL 不要关心证书(“-k”选项)来解决这个问题,但这并不理想。
有没有办法将连接的 IP 地址与通过 SSL 认证的主机隔离?
我有几台服务器在同一台机器上运行,有些只使用 http,有些同时使用 http 和 https。在单独的文件中定义了几个服务器块,这些文件包含在主配置文件中。
我已经为 http 设置了一个“默认”服务器,它将为与其他配置文件中的任何其他 server_names 不匹配的请求提供通用的“维护页面”。http 默认服务器按预期工作,它使用 server_name "_" 并且它首先出现在包含列表中(因为我观察到在跨服务器重复 server_names 的情况下,使用第一个出现的)。这很好用。
我希望完全相同的服务器块(仅将“listen 80 default_server”切换为“listen 443 default_server”,而不是服务页面“return 444”),但事实并非如此。相反,看起来新的默认 https 服务器实际上是在获取所有传入的 https 连接并导致它们失败,尽管其他服务器块对传入请求有更合适的 server_names。删除新的默认 https 服务器将导致恢复半正确行为:带有 https 的网站将全部正确加载;但是没有 https 的网站都将被路由到包含文件中的第一个 https 服务器(根据文档,如果没有出现“default_server”,那么出现的第一个服务器块将是“default”)。
所以我的问题是,在 nginx 中为 ssl 连接定义“默认服务器”的正确方法是什么?为什么当我显式设置“default_server”时,它会变得贪婪并获取所有连接,而当我隐式让 nginx 决定“默认服务器”时,它会像我期望的那样工作(将不正确的服务器设置为默认值,而其他真实服务器)行为正确)?
这是我的“默认服务器”。Http 可以在不破坏其他服务器的情况下工作。Https 破坏其他服务器并消耗所有服务器。
server {
listen 443 ssl default_server;
server_name _;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
return 444;
}
server {
listen *:80 default_server;
server_name _;
charset utf-8;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
root /home/path/to/templates;
location / { …Run Code Online (Sandbox Code Playgroud) 我想在 nginx 中创建一个规则来做两件事:
有很多关于如何单独执行这些操作的示例,但我无法找到一个正确执行这两项操作的解决方案(即不创建重定向循环并正确处理所有情况)。
它需要处理所有这些情况:
1. http://www.example.com/path
2. https://www.example.com/path
3. http://example.com/path
4. https://example.com/path
Run Code Online (Sandbox Code Playgroud)
这些都应该在https://example.com/path (#4) 结束而不循环。有任何想法吗?
我有两个运行在同一台服务器上的 ruby on rails 3 应用程序,(ubuntu 10.04),都带有 SSL。
这是我的 apache 配置文件:
<VirtualHost *:80>
ServerName example1.com
DocumentRoot /home/me/example1/production/current/public
</VirtualHost>
<VirtualHost *:443>
ServerName example1.com
DocumentRoot /home/me/example1/production/current/public
SSLEngine on
SSLCertificateFile /home/me/example1/production/shared/example1.crt
SSLCertificateKeyFile /home/me/example1/production/shared/example1.key
SSLCertificateChainFile /home/me/example1/production/shared/gd_bundle.crt
SSLProtocol -all +TLSv1 +SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM
</VirtualHost>
<VirtualHost *:80>
ServerName example2.com
DocumentRoot /home/me/example2/production/current/public
</VirtualHost>
<VirtualHost *:443>
ServerName example2.com
DocumentRoot /home/me/example2/production/current/public
SSLEngine on
SSLCertificateFile /home/me/example2/production/shared/iwanto.crt
SSLCertificateKeyFile /home/me/example2/production/shared/iwanto.key
SSLCertificateChainFile /home/me/example2/production/shared/gd_bundle.crt
SSLProtocol -all +TLSv1 +SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
什么问题:
在重新启动我的服务器时,它给了我一些这样的输出:
* Restarting web server apache2
[Sun Jun 17 17:57:49 2012] [warn] …Run Code Online (Sandbox Code Playgroud) 我们希望我们的网络服务器 (IIS 10) 上的所有站点都强制执行 SSL(即将 HTTP 重定向到 HTTPS)。
我们目前正在每个站点上“要求 SSL”,并设置一个403 error处理程序来执行302 redirect该特定站点的 https 地址。
这很好用。但是对于每个站点来说都是痛苦的,人为错误的空间很大。
理想情况下,我想建立一个永久301 redirect所有HTTP://*以HTTPS://*
在 IIS 中是否有一种简单的方法可以做到这一点?
当我们可以使用 openSSL 在本地生成 SSL 证书时,我无法理解为什么需要购买 SSL 证书。我购买的证书和我在本地生成的测试证书有什么区别?这只是一个大骗局吗?
https ×10
nginx ×4
ssl ×4
apache-2.2 ×2
http ×2
redirect ×2
301-redirect ×1
curl ×1
httpd.conf ×1
iis ×1
openssl ×1
passphrase ×1
rewrite ×1