ローカル上にサーバーがあるのにグローバルネットワークを介した通信をするのは非常に無駄が多くインターネットの回線速度がネックになりやすいです
そのためローカルネットワークとグローバルネットワークを分けて使用すれば無駄を減らせるわけですが非常に面倒くさいです
サーバー側の設定をすることによりシームレスに切り替える方法を紹介します
※この記事はNextcloudを自宅サーバーでセルフホストしている人向けの記事です
目次
追記
v3.6.1で証明書関係が厳しくなりするのが難しくなった
trust optionなどを使えば回避できそう
構成
- 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.1
とhttp://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