惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 【当耐特】
N
Netflix TechBlog - Medium
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
雷峰网
雷峰网
MongoDB | Blog
MongoDB | Blog
有赞技术团队
有赞技术团队
Engineering at Meta
Engineering at Meta
M
MIT News - Artificial intelligence
Google DeepMind News
Google DeepMind News
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
T
Tailwind CSS Blog
小众软件
小众软件
J
Java Code Geeks
人人都是产品经理
人人都是产品经理
博客园_首页
MyScale Blog
MyScale Blog
博客园 - 聂微东
V
Visual Studio Blog
The Cloudflare Blog
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
U
Unit 42

Dallas Lu

一些没有意义的事情 博客程序的一次大重构 OpenWRT 使用 udp2raw 对抗 WireGuard 阻断 如何证明你是原创作者 Nginx 泛域名配置的隐患与对策 WISeID S/MIME 证书 V2EX 刑满释放记 使用 Radicale 在 Ubuntu 24.04 中搭建 vCards CardDav 服务 邮件服务的域名成功从 SURBL 黑名单移除 网站多语言的设计细节 网站评论系统的目前进展和展望 在公网使用 iptables 转发端口时保留客户端 IP 邮件投递平台 Postal 的使用经验 自建 Postal 完美替代 SendGrid 互联网在崩塌吗,然后呢 在 SvelteKit 应用中使用 JSON-LD 网页的打印样式应该怎么写 “茴字的四种写法”之 IP 与域名 怎么伪造 Git 提交的时区 供大众交流的论坛和其它替代产品还是不好用 Nginx 反代 Apache Subversion 添加 HTTPS 使用你的主域名作为 Mastodon 实例名 プライマリドメイン名をMastodonのインスタンスとして使用します Firefox 和 Chrome 为何要革 EV 证书的命 FirefoxとChromeがEVライフに革命を起こす理由
NginxリバースプロキシApache Subversion
达拉斯・卢 · 2022-01-03 · via Dallas Lu

Subversionは10年前のもののように聞こえます。特に mod_dav_svn。しかし、祖先のコードがどこに配置されているかを言うのは難しいです。要するに、あなたはすでに既製のNginxを持っていて、すでにストリーキングしているコードリポジトリにHTTPSサポートを追加したいのですが、それは proxy_passがそれを行うことができるわけではありません。

例えば:

upstream subversion{
    127.0.0.1:1080;
}
server{
    listen [::]:443;
    server_name svn.example.com;

    # SSL ...

    location / {
        proxy_pass http://subversion;
    }
}

まず、おめでとうございます。proxy_pass http://subversion/ は使用されていないため、最初のピットは回避されます。末尾の /文字により、NginxがURLを自動的にエンコードし、通常の使用に影響するためです。ただし、送信時にすぐに502エラーが発生します。

COPYおよびDELETEのサポート

Subversionは https://svn.example.com をHTTPS接続と見なし、ApacheはHTTPサービスのみを提供するため、リクエストヘッダーの Destinationhttp:// で始まる必要があります。

すぐに、Stackoverfollowから変更する方法を見つけました。

location / {
    proxy_pass http://subversion;
    set $fixed_destination $http_destination;
    if ( $http_destination ~* ^https(.*)$ ) {
        set $fixed_destination http$1;
    }
    proxy_set_header Destination $fixed_destination;
}

その後、すべてがOKであることがわかりました。とても良いです、それは本当に2番目のピットに落ちました。

Nginxの紛らわしい動作

$fixed_destination は、https://http:// に置き換えるだけのように見えます。非常にシンプルで明確で、問題ありません。

トランクから新しいブランチを喜んでコピーするときは、ファイル名に中国語が含まれているファイルを変更し、コンパイルしてテストにスムーズに合格します。次に、トランクにマージして戻すときに、十分に注意すれば、ファイル名がurlencodedされていることがわかります。もちろん、それは中国の名前ファイルを含むだけではありません、想像してみてください、しかしブランチで提出されたすべてのファイルの名前はurlencodedです!そして、urlencodedされたファイル名は、次回ブランチがマージされるときに再びurlencodedされます!

問題は $fixed_destination にあります。http$1 は実際にはNginxによってurlencodedされています。この魔法の問題を回避するために、Destinationの変更をApacheに任せるか、それをデコードするためのluaスクリプトを作成することにしたかもしれません。ちょっと待って!別の魔法の解決策は次のとおりです。

location / {
    proxy_pass http://subversion;
    set $fixed_destination $http_destination;
    if ( $http_destination ~* ^https(?<unencoded_destinaton>.*)$ ) {
        set $fixed_destination http$unencoded_destinaton;
    }
    proxy_set_header Destination $fixed_destination;
}

マッチングに使用する通常のグループに名前を追加するだけでOKです…

他の

このソリューションは、9年以上前のMaxim Dounin からの返信に基づいています。 したがって、名前付きキャプチャグループを使用して、Nginxの正規表現を使用して変数を変更することをお勧めします

10年前のソフトウェアアーキテクチャ、10年前の問題は、10年後もまだ存在しています。 驚くべきことに、10年前のソリューションはまだ機能しています。