Apache HTTP转HTTPS重定向异常:带/redirect后缀URL求助
解决Apache重定向Jenkins带/redirect后缀URL的404问题
嘿,我看出来你的问题核心在哪了——mod_alias的Redirect指令优先级比mod_rewrite的RewriteRule高,所以当请求进来时,Apache直接先执行了Redirect permanent / https://jenkins.example.net/,把所有HTTP请求原样重定向到HTTPS的对应路径,你写的那条去除/redirect后缀的规则完全没机会跑起来。这就导致带/redirect的URL被原封不动转到HTTPS,而Jenkins后端根本没有这个路径,自然返回404了。
另外提一句,你curl输出里的SEC_ERROR_UNKNOWN_ISSUER是客户端证书信任问题,和重定向无关;要是浏览器访问也报这个错误,得确保客户端信任你的证书链,不过咱们先解决核心的重定向问题。
修复方案:用mod_rewrite统一处理路径修改和HTTPS跳转
把HTTP VirtualHost里的Redirect指令删掉,改用mod_rewrite按顺序完成两个操作:先去掉/redirect后缀,再跳转到HTTPS。这样能保证路径修改先执行,再用修改后的路径做重定向。
修改后的完整配置
<VirtualHost *:80> ServerName jenkins.example.net RewriteEngine On # 第一步:匹配所有以/redirect结尾的URL,去掉后缀;L标记表示匹配后停止后续规则 RewriteRule ^(.*)/redirect$ $1 [L,NC] # 第二步:把所有HTTP请求永久重定向到HTTPS RewriteRule ^(.*)$ https://jenkins.example.net$1 [L,R=301] </VirtualHost> <VirtualHost *:443> proxyRequests Off ProxyPreserveHost On AllowEncodedSlashes NoDecode ProxyPass / http://127.0.0.1:8080/ nocanon ProxyPassReverse / http://127.0.0.1:8080/ ServerName jenkins.example.net ErrorLog /etc/ssl/error_log SSLEngine on SSLCertificateFile /etc/ssl/certs/fopjenkins.pem SSLCertificateKeyFile /etc/ssl/certs/fopjenkins.key RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-Port "443" </VirtualHost>
关键规则说明
RewriteRule ^(.*)/redirect$ $1 [L,NC]:这条规则会先拦截所有带/redirect后缀的请求,把路径改成去掉后缀的版本;NC保证匹配不区分大小写,L告诉Apache“匹配到这条就别往下走了,先处理完这个路径修改”。RewriteRule ^(.*)$ https://jenkins.example.net$1 [L,R=301]:等路径修改完成(或者没匹配到上一条规则的普通请求),再把所有HTTP请求转到HTTPS;R=301和你原来的Redirect permanent是完全一致的永久重定向效果。
验证方式
用curl测试的时候加上-k跳过证书验证,看看跳转流程是否符合预期:
curl -vLk http://jenkins.example.net/job/STUFOP/job/deploy_os/job/master/5/display/redirect
这次应该会看到请求先去掉/redirect后缀,再跳转到HTTPS的正确路径,最终Jenkins能返回对应的页面,不会再出现404了。
内容的提问来源于stack exchange,提问作者harshavmb
相关产品推荐
相关产品推荐

