proxy_pass根据path路径转发时的"/"问题记录

在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/。当加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。

比如下面设置:
location ^~ /wangshibo/
{
proxy_cache js_cache;
proxy_set_header Host js.test.com;
proxy_pass http://js.test.com/;
}
如上面的配置,如果请求的url是http://servername/wangshibo/test.html会被代理成http://js.test.com/test.html

而如果这么配置
location ^~ /wangshibo/
{
proxy_cache js_cache;
proxy_set_header Host js.test.com;
proxy_pass http://js.test.com;
}
则请求的url是http://servername/wangshibo/test.html会被代理到http://js.test.com/wangshibo/test.html

当然,可以用如下的rewrite来实现/的功能
location ^~ /wangshibo/
{
proxy_cache js_cache;
proxy_set_header Host js.test.com;
rewrite /wangshibo/(.+)$ /$1 break;
proxy_pass http://js.test.com;
}

-----------------------------------------------------看看下面的实例--------------------------------------------------------------

1)第一种配置
[[email protected]_16_202_V vhosts]# cat ssl-wangshibo.conf
upstream at {
    server 172.29.16.202:8080 max_fails=3 fail_timeout=30s;
}

server {
   listen 443;
   server_name www.wangshibo.com;
   ssl on;

   ### SSL log files ###
   access_log logs/wangshibo_access.log;
   error_log logs/wangshibo_error.log;

### SSL cert files ###
   ssl_certificate ssl/bkjk.cer;
   ssl_certificate_key ssl/bkjk.key;  

   location /attendance/ {
   proxy_pass http://at;                                                          //不需要加上"/"
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
   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 https;
   proxy_redirect off;
       }

}

访问https://www.wangshibo.com/attendance/和http://172.29.16.202:8080/attendance结果是一致的。

2)第二种配置
[[email protected]_16_202_V vhosts]# cat ssl-wangshibo.conf
upstream at {
    server 172.29.16.202:8080 max_fails=3 fail_timeout=30s;
}

server {
   listen 443;
   server_name www.wangshibo.com;
   ssl on;

   ### SSL log files ###
   access_log logs/wangshibo_access.log;
   error_log logs/wangshibo_error.log;

### SSL cert files ###
   ssl_certificate ssl/bkjk.cer;
   ssl_certificate_key ssl/bkjk.key;  

   location / {
   proxy_pass http://at/attendance/;                                                  //一定要加上"/"
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
   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 https;
   proxy_redirect off;
       }

}

访问https://www.wangshibo.com和http://172.29.16.202:8080/attendance结果是一致的。
时间: 2024-08-07 00:16:00

proxy_pass根据path路径转发时的"/"问题记录的相关文章

Linux系统中增加和删除环境变量PATH路径详解

http://blog.csdn.net/pipisorry/article/details/39507699 Linux系统中要把/etc/apache/bin目录添加到PATH中: 1.#PATH=$PATH:/etc/apache/bin 使用这种方法,只对当前会话有效,也就是说每当登出或注销系统以后(关闭terminal就会失效),PATH 设置就会失效 2.#vi /etc/profile 在适当位置添加 PATH=$PATH:/etc/apache/bin (注意:= 即等号两边不能

[转]sudo找不到命令:修改sudo的PATH路径

sudo有时候会出现找不到命令,而明明PATH路径下包含该命令,让人疑惑.其实出现这种情况的原因,主要是因为当 sudo以管理权限执行命令的时候,linux将PATH环境变量进行了重置,当然这主要是因为系统安全的考虑,但却使得sudo搜索的路径不是我们想要的PATH变量的路径,当然就找不到我们想要的命令了.两种方法解决该问题: 首先,都要打开sudo的配置文件:sudo visudo 方法1:可以使用 secure_path 指令修改 sudoers 中默认的 PATH为你想要的路径.这个指令指

sudo找不到命令:修改sudo的PATH路径

sudo有时候会出现找不到命令,而明明PATH路径下包含该命令,让人疑惑.其 实出现这种情况的原因,主要是因为当 sudo以管理权限执行命令的时候,linux将PATH环境变量进行了重置,当然这主要是因为系统安全的考虑,但却使得sudo搜索的路径不是我们想要 的PATH变量的路径,当然就找不到我们想要的命令了.两种方法解决该问题: 首先,都要打开sudo的配置文件:sudo visudo 1.可以使用 secure_path 指令修改 sudoers 中默认的 PATH为你想要的路径.这个指令指

Python之os.path路径模块中的操作方法总结

#os.path模块主要集成了针对路径文件夹的操作功能,这里我们就来看一下Python中的os.path路径模块中的操作方法总结,需要的朋友可以参考下 解析路径路径解析依赖与os中定义的一些变量: os.sep-路径各部分之间的分隔符. os.extsep-文件名与文件扩展名之间的分隔符. os.pardir-路径中表示目录树上一级的部分. os.curdir-路径中当前目录的部分. split()函数将路径分解为两个单独的部分,并返回包含这些结果的tuple.第二个元素是路径的最后部分,地一个

Linux系统下修改环境变量PATH路径的三种方法

比如要把/etc/apache/bin目录添加到PATH中,方法有三: 1.#PATH=$PATH:/etc/apache/bin 使用这种方法,只对当前会话有效,也就是说每当登出或注销系统以后,PATH 设置就会失效 2.#vi /etc/profile 在适当位置添加 PATH=$PATH:/etc/apache/bin (注意:= 即等号两边不能有任何空格) 这种方法最好,除非你手动强制修改PATH的值,否则将不会被改变 3.#vi ~/.bash_profile 修改PATH行,把/et

刚开始学java和刚去工作的时候,1.path路径 2.classpath路径 还有JAVA_HOME相当于/dgs这个路径

1.PATH路径,寻找javac.exe 如:%JAVA_HOME% 即是对应的是这个路径 在对应的路径下找到了这个命令 删除掉之后 在用户变量下面重新配置一下,也可以运行了 用户变量要是换了一个用户的话,则这路径失效,要无论什么用户都有效,在系统变量里配置 claspath路径,按路径寻找class文件并执行 新下载一个JDK 然后只进行了path变量的配置 javac编译  java运行 命令 输入java 和 java命令可以运行 cclasspath没配在当前路劲下找   配了只在cla

Linux下修改PATH路径

1.#PATH=$PATH:/opt/lamp/mysql/bin       使用这种方法,只对当前会话有效,也就是说每当登出或注销系统以后,PATH 设置就会失效 2.#vi /etc/profile       在适当位置添加 PATH=$PATH:/etc/apache/bin (注意:= 即等号两边不能有任何空格)这种方法最好,除非你手动强制修改PATH的值,否则将不会被改变 但一般情况下我们不直接在这里面修改,在/etc/profile开头有这样的提示: # It's NOT a g

【转】怎么在Foxmail回复/转发时使用签名?

原文网址:http://kf.qq.com/faq/120322fu63YV130422yABZRZ.html Foxmail回复/转发时使用签名,可通过在模版中设置签名.如下版本操作方法: 一.foxmail7.1以上版本设置模版的方法: 在foxmail右上角三条线进入“菜单”=>工具=>模板管理,左下方选择帐号,右下方可设置该帐号发送新邮件.回复.转发时分别使用的模板,模板的内容则显示在上方的预览区域. 二.foxmail7.0版本设置模版的方法: 在foxmail主界面选择 “工具”=

获取文件path路径中的文件名(是否包含扩展名)

直接看代码吧 #获取文件path路径中文件名(去掉目录路径) sub get_file_basename{ my ($file_path) = @_; my @tmp_arr = split(/[\\|\/]+/,$file_path); my $len = @tmp_arr; if ($len >=2) { return $tmp_arr[-1]; }else{ return $file_path; } } #获取文件path路径中文件名(去掉目录路径,去掉扩展名) sub get_file_