Nextcloud ローカルネットワークとグローバルネットワークをシームレスに切り替える

2022年8月20日

ローカル上にサーバーがあるのにグローバルネットワークを介した通信をするのは非常に無駄が多くインターネットの回線速度がネックになりやすいです
そのためローカルネットワークとグローバルネットワークを分けて使用すれば無駄を減らせるわけですが非常に面倒くさいです

サーバー側の設定をすることによりシームレスに切り替える方法を紹介します

※この記事はNextcloudを自宅サーバーでセルフホストしている人向けの記事です

追記

v3.6.1で証明書関係が厳しくなりするのが難しくなった
trust optionなどを使えば回避できそう

⚠️ Before submitting, please verify the following: ⚠️ This is a bug, not a quest…
github.com

構成

  • Nextcloud 24.0.4
  • Nginx 1.18.0

設定

※ローカルアドレスとグローバルアドレスのどちらでもアクセスできるように設定がされていてNginxの設定は公式ドキュメントと同じものを使用しているものとして説明します

Nginxの設定ファイルのlocation ~ \.php(?:$|/)のブロックの中に以下を追加します

set $flag "A";
if ($request_uri ~ "/remote.php" ) {
    set $flag "${flag}A"; 
}
if ($http_user_agent ~ "Nextcloud" ) {
    set $flag "${flag}A"; 
}
if ($remote_addr = "192.168.11.1") {
    set $flag "${flag}A"; 
}
if ($request_method = GET ) {
    set $flag "${flag}B"; 
}
if ($request_method = PUT ) {
    set $flag "${flag}B"; 
}
if ($flag = "AAAAB"){
    rewrite ^(.*)$ https://192.168.11.20$1 permanent;
}

192.168.11.1http://192.168.11.20は環境に合わせたものに変えて下さい
前者はデフォルトゲートウェイ、後者はサーバーのローカルIPアドレスです

SSLの場合は証明書のエラーが出ますがちゃんと使えます
LAN内に悪意のある人が居ない場合に限りますがセキュリティ的にも恐らく大丈夫だと思います

仕組み

NextcloudはAPIにリダイレクトがあった際に問題なくリダイレクトします
そのため特定のリモートアドレスからアクセスがあった際にリダイレクトするようにすれば良いです

ただ、そうした場合ブラウザでアクセスした場合にCSP制限に引っかかって使えないためUser-Agentで判別しています

WebdavではメゾットのGETがダウンロードでPUTがアップロードです

また、Nginxは分岐でandが使えないため$flagを使用して分岐を行ってます

User-Agentについて

Windowsクライアント

Mozilla/5.0 (Windows) mirall/3.5.4stable-Win64 (build 20220802) (Nextcloud, windows-10.0.19044 ClientArchitecture: x86_64 OsArchitecture: x86_64)

Androidクライアント

Mozilla/5.0 (Android) Nextcloud-android/3.21.0

サードパーティ製クライアント
このクライアントでは自動リダイレクトが出来なかったのでリダイレクトしないようにしています

DavClient-okhttp3/0.1.0