试题内容
如果网站配置了多域名,要根据不同的域名分别https访问,应该怎么配置?
在rewrite的时候使用$host,如下:
1
2
3
4
5
6
7
8
9
10
11server
{
listen 80;
server_name www.test.com www.test.com.cn;
index index.html index.htm index.php;
root /home/wwwroot;
location / {
rewrite ^/(.*)$ https://$host/$1 permanent;
}
}
如果是要笨一点的方法就是:
1
2
3
4
5
6
7
8
9
10
11
12
13server
{
listen 80;
server_name www.test.com www.test.com.cn;
index index.html index.htm index.php;
root /home/wwwroot;
if ($host = 'www.test.com.cn' ) {
rewrite ^/(.*)$ https://www.test.com.cn/$1 permanent;
}
if ($host = 'www.test.com' ) {
rewrite ^/(.*)$ https://www.test.com/$1 permanent;
}
ps.阿里云的SLB绑定多个HTTPS证书的文档:https://help.aliyun.com/document_detail/87023.html?spm=a2c4g.11186623.6.741.7e11301bVLBAJz
2.在Nginx中,如何使用未定义的服务器名称来阻止处理请求?
只需将请求删除的服务器就可以定义为:
1
2
3
4
5Server {
listen 80;
server_name " ";
return 444;
}
这里,服务器名被保留为一个空字符串,它将在没有“主机”头字段的情况下匹配请求,而一个特殊的Nginx的非标准代码444被返回,从而终止连接。
3.ajax是同步还是异步,怎么样实现同步?
ajax里async属性默认的设置值为true
,这种情况为异步方式
。即网页里有两个函数func(x)和func(y),在打开网页的时候,后台会先去执行func(x),然后等待server返回结果,同时还有一个线程会去执行func(y)。
当把async设为false
时,这时ajax的请求是同步
的,也就是说,这个时候ajax块发出请求后,他会等待在func(x)这个地方,不会去执行func(y),直到func(x)部分执行完毕。
4.nginx如何实现http跳转https?
需要用到地址重写代码,用以下代码能让http强制跳转到https:
1
2
3
4
5
6server {
listen 80;
listen [::]:80; #支持ipv6
server_name www.test.com;
return 301 https://$server_name$request_uri;
}
6.如果某个网站做了两个域名,分别是https://www.aaa.com和https://www.bbb.com,如果做了www.aaa.com cname到www.bbb.com,那么浏览器打开www.aaa.com会是什么界面?
打开页面会出现“https证书不正确”的风险提示。
7.接着上面问题,在nginx里做了rewrite或者配置了显性URL,此时取消掉www.aaa.com本身的ip(即www.aaa.com没有ip,但是www.bbb.com有ip),浏览器里打开www.aaa.com会是什么界面?
会显示“无法找到www.aaa.com的IP地址”(第一步就失败了...)。
8.要求a.com
和www.a.com
都跳到www.b.com
,而www.a.com/123
不跳,如何配置?
配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14server {
listen 80;
server_name www.a.com a.com;
#根目录跳转
location / {
rewrite .+ http://www.b.com/ permanent;
}
#非根目录本地执行
location ~* /.+ {
#已省略余下通用配置内容
}
}
9.为了安全,Web服务器不要求启用所有可用的方法,只允许GET
,HEAD
和POST
方法,其他的全部过滤掉。实现其功能的代码如下:
1
2
3if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
10.对/download/目录做“最大下载速度20K,同时最多2个并发链接的限制”
1
2
3
4
5
6
7
8
9http {
limit_zone my_zone $binary_remote_addr 10m; #在 http 段配置定义一个limit_zone
server {
location /download/ {
limit_conn my_zone 2; #limit_conn和 limit_rate参数进行限速设置
limit_rate 20k;
}
}
}
limit_zone
:针对每个 IP 定义一个存储 session 状态的容器。本例中定义了一个my_zone的10m大小的容器。limit_conn my_zone 2
:限制在my_zone中记录状态的每个IP只能发起2个并发连接。本例中,客户端访问/download目录时,会限制2个并发连接。limit_rate 20k
:对每个连接限速20k。注意,这里是对连接限速,而不是对IP限速。如果一个IP允许2个并发连接,那么这个IP就是限速为limit_rate*2
,在设置的时候要根据自己的需要做设置调整。
11.简单说明nginx配置文件里面alias和root的区别
Nginx配置文件server中指定两个location执行,分别为root和alias指令:
1
2
3location /test/ {
alias /www/test/;
}
按照上述配置,则访问/test/目录里面的文件时,nginx会去/www/test/
目录找文件:
1
2
3location /test/ {
root /www/test;
}
按照这种配置,则访问/test/目录下的文件时,nginx会去/www/test/test/
目录下找文件。
另一个区别是alias后面必须要用/
结束,否则会找不到文件,而root则对/
可有可无。
注意!location后面的/test/如果是/test的话(没有用/收尾),而同时alias的文件夹是有/收尾的话,就会出现“目录穿越”漏洞,即外来人可以访问你/www/test../即www文件夹的内容。详情可见 https://www.leavesongs.com/PENETRATION/nginx-insecure-configuration.html 。
12.CDN缓存命中率下降的因素有哪些?
- 客户是否刷新过缓存?
答:如果刷新缓存,有可能会短时间表现命中率下降。特别说明下:CDN的url或者目录刷新是清除CDN缓存的动作(这个比较容易理解偏差) - 带宽是否突增?并且访问的都是新的URL?
答:带宽突增或者访问的新URL较多,会导致CDN节点回源较多,命中率会表现有下降趋势。 - 源站是否有新内容发布?
答:CDN节点访问新内容,导致CDN节点回源较多,命中率会表现有下降趋势。 - 源站是否出现过异常导致5XX和4XX增加,由于5XX和4XX不缓存,会表现命中率下降。
- 源站的访问url的header参数,或者在CDN控制管理后台的缓存配置规则是否改变过?
答:缓存时长的调整,有可能会带来命中率的变化。
13.如果判断url是否命中CDN缓存?
查看响应头信息中的X-Cache
字段。
- 显示
MISS
,说明没有命中CDN缓存,是回源的。 - 显示
HIT
,是命中了CDN缓存。
除了X-Cache
还有如下几个参数与CDN有关:X-Swift-SaveTime
:内容开始在CDN上缓存的时间。由于系统时间是GMT时间,所以需要折算成北京时间。X-Swift-CacheTime
:CDN的默认缓存时间,以秒为单位。Age
:该内容在CDN上已经缓存了的时间。
14.AJAX从b.com请求另一个域a.com的地址会有跨域的问题,如何配置?
1
2
3
4
5
6
7
8
9server {
listen 80;
server_name b.com;
location /{
add_header 'Access-Control-Allow-Origin' 'http://a.com';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET';
}
}
第一条add_header:授权从a.com的请求
第二条add_header:当该标志为真时,响应于该请求是否可以被暴露
第三条add_header:指定请求的方法,可以是GET,POST,PUT,DELETE,HEAD
如果想允许来自任何域的请求,可以这样:
1
2
3
4
5
6
7server {
listen 80;
server_name b.com;
location /{
Access-Control-Allow-Origin: *
}
}
15.如果想配置2-3个域设置为信任,其他的域名被排除,应该如何配置?
1
2
3
4
5
6
7
8
9server {
listen 80;
server_name b.com;
location /{
if ( $http_referer ~* (a.com|b.com|c.com) ) {
Access-Control-Allow-Origin: *
}
}
}
16.将不带www的访问强制加上www怎么做?
1
2
3
4 # 下面这句就是当识别到 HOST 不是带 www 的全部都 302 带上 www
if ( $host != 'www.your-domain.com' ) {
rewrite ^(.*)$ https://www.your-domain.com$1 permanent;
}
参考资料
https://my.oschina.net/mrpei123/blog/1794001
http://note.qidong.name/2017/09/nginx-https-hsts/
https://www.ssllabs.com/ssltest/index.html(测试ssl安全的网站)