问题的描述:

报错截图:
nginx rewrite解决 jenkins error 404心得笔记_第1张图片
登录按钮截图:

nginx rewrite解决 jenkins error 404心得笔记

登录链接:

http://jenkins.oceanwing.com/securityRealm/commenceLogin?from=%2FsecurityRealm%2FloggedOut

点击“登录”,浏览器地址栏地址变成:

http://jenkins.oceanwing.com/securityRealm/#

分析问题:

看起来是跳转问题,

思路:

考虑到nginx的rewrite可能可以解决这个问题

nginx配置文件中参数:

正则表达式匹配,其中:
* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配
文件及目录匹配,其中:
* -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-x用来判断文件是否可执行
flag标记有:
* last 相当于Apache里的[L]标记,表示完成rewrite
* break 终止匹配, 不再匹配后面的规则
* redirect 返回302临时重定向 地址栏会显示跳转后的地址
* permanent 返回301永久重定向 地址栏会显示跳转后的地址
一些可用的全局变量有,可以用做条件判断
$args, 请求中的参数;
$content_length, HTTP请求信息里的"Content-Length";
$content_type, 请求信息里的"Content-Type";
$document_root, 针对当前请求的根路径设置值;
$document_uri, 与$uri相同;
$host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$limit_rate, 对连接速率的限制;
$request_method, 请求的方法,比如"GET"、"POST"等;
$remote_addr, 客户端地址;
$remote_port, 客户端端口号;
$remote_user, 客户端用户名,认证用;
$request_filename, 当前请求的文件路径名
$request_body_file
$request_uri, 请求的URI,带查询字符串;
$query_string, 与$args相同;
$scheme, 所用的协议,比如http或者是https,比如rewrite  ^(.+)$  $scheme://example.com$1  redirect;
$server_protocol, 请求的协议版本,"HTTP/1.0"或"HTTP/1.1";
$server_addr, 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
$server_name, 请求到达的服务器名;
$server_port, 请求到达的服务器端口号;
$uri, 请求的URI,可能和最初的值有不同,比如经过重定向之类的。

nginx rewrite解决 jenkins error 404心得笔记_第2张图片

$args是当前url问号后面的部分,相当于$query_string
$arg_id是id的值,格式为$arg_
rewrite是url重写命令
permanent代表的是返回301永久重定向状态码
$host为当前网站的域名部分
结尾的问号代表不会将url后面的参数一起带过去
^和$是代表的是正则匹配
注意:nginx中if命令不能嵌套,不能有多条件
if条件中的等号只有一个
注意if的空格问题
if条件中可以有多条url重写语句
重定向是基于文件的,示例中是适用于commenceLogin?from=%2FsecurityRealm%2FloggedOut的结构

检查和重载nginx配置

nginx -t
nginx -s reload

点击“登录”,链接重定向:

http://jenkins.oceanwing.com/?from=%2FsecurityRealm%2FloggedOut#

curl检查:

nginx rewrite解决 jenkins error 404心得笔记_第3张图片

问题解决