微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Nginx将所有非子域请求redirect到httpsapex域

我有一个相当复杂的Ruby应用程序,它为客户提供了一个在他们自己select的子域下可用的仪表板。 即: http://mycompany.app.com : http://mycompany.app.com : http://myproject.app.com 。

我也有产品网站运行在根域(即, http://app.com ),我已经购买并configuration了Nginx的SSL证书,它的工作方式与预期的一样,但是这给我带来了以下问题:

我需要将所有非httpsstream量redirect到该页面的https版本,除了任何请求转到任何子域。 是什么让棘手的是,我不过需要将网站的www版本redirect到非www版本。

http://app.com -> https://app.com http://www.app.com -> https://app.com http://nike-admin.app.com !-> https://nike-admin.app.com

以下是我在Nginx.conf中为这个应用程序(实际名称由app取代)到目前为止:

SED和variables稍有麻烦

匹配文件中的空行Grep

使用mod_rewrite删除.PHP扩展名,同时清理GET URL

Nginx取代一个css样式表

在linux下的c + + 11的正则expression式的奇怪的行为

upstream unicorn_server { server unix:/var/www/<app>/tmp/sockets/unicorn.sock fail_timeout=0; } server { listen 80; listen [::]:80 default_server ipv6only=on; server_name <app>.co; location / { rewrite ^ https://$server_name$request_uri permanent; } } server { server_name <app>.co; root /var/www/<app>.co/public; client_max_body_size 4G; keepalive_timeout 70; listen 443 ssl; ssl_certificate /etc/Nginx/ssl/<app>.crt; ssl_certificate_key /etc/Nginx/ssl/<app>.key; location / { try_files $uri @app; } location @app { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://unicorn_server; } }

在第一个服务器块中,我明确地侦听端口80上的任何连接,并将其redirect到https版本,但这是一把双刃剑,因为SSL证书只覆盖顶点域。 我不希望除了www以外的任何子域名的请求被redirect到https等效。

我可以使用正则expression式,但从我在网上看到的,但似乎是皱眉了?

有没有其他方法可以做到这一点?

SED:在比赛前处理两条线

在特定模式之后,sedreplace

用sedreplace同等长度的文本

networking掩码validation似乎不工作在bash脚本中使用正则expression式,而IPvalidation工作正常

preg_match函数中的RegExp返回浏览器错误

你可以使用下面的正则表达式:

/^.*?b(?!www.)((?:[w-]+.)+[w-]+).*$/

用。。。来代替:

https://$1

这是一个正则表达式演示 !

^断言在字符串的开始位置。

.*? 匹配任何数量的字符,除了新行在懒惰匹配。 (char by char)

b断言一个字边界位置( wW或Ww 。)

(?!负面的前瞻:断言我们的立场不是

www. 字符序列“www。”

)然后进行比赛:

(打开一个捕获组,这样我们可以在替换中使用一个反向引用。

(?:打开一个非捕获组。

[w-]+. 任何单词字符或连字符序列(因为连字符可能在域名中),后跟一个点。

)+一个或多个组。

[w-]+另一组单词字符或连字符。

)关闭组。

.*匹配字符串的其余部分,但不是域的一部分,因此被忽略。

$在字符串结尾处声明位置。 这个锚点可能不是必须的,但为了可读性,这是很好的。

阅读更多:

如何使用JavaScript正则表达式从字符串中获取

(http://(www.)?)([a-zA-Z-]+.)(?![a-zA-Z-]+.)

这将匹配:

任何使用http ; 要么

任何以www开头的东西。

不会匹配:

任何有子域的东西。

如果你想做一个红宝石替换,下面是一些例子(在irb中):

http://app.com (切换到https)

2.1.1 :047 > "http://app.com".sub /(http://(www.)?)([a-zA-Z-]+.)(?![a-zA-Z-]+.)/,'https://3' => "https://app.com"

http://www.app.com (切换到https)

2.1.1 :046 > "http://www.app.com".sub /(http://(www.)?)([a-zA-Z-]+.)(?![a-zA-Z-]+.)/,'https://3' => "https://app.com"

http://subdomain.app.com (保持不变)

2.1.1 :045 > "http://subdomain.app.com".sub /(http://(www.)?)([a-zA-Z-]+.)(?![a-zA-Z-]+.)/,'https://3' => "http://subdomain.app.com"

我使用这种结构,它工作正常:

server { listen 80; server_name my.site.ru www.my.site.ru; rewrite ^(.*)$ https://my.site.ru$1 permanent; }

我也有_http://(www。)site.ru http(s)://(www。)othermy.site.ru域名,这是可以的。

从版本0.8.4开始,应该使用更好

return 301 https://$http_host$request_uri;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐