Nextcloudのドメイン変更と共有リンク修復 – 実践検証レポート

Nextcloudのドメインを変更するとその影響は?

わけあってNextcloudのドメインを変更することになりました。
融通の利くAWSやOCIなどのクラウドサービスに設置したわけではなく、日本の制限のあるレンタルサーバーというのも気にかかります。具体的にはロリポップです。
ドメイン変更は以下を想定しています。
nextcloud.minokamo.xyz

nextcloud.minokamo.tokyo

Nextcloudはデータベース(mysql)を必要としているのでその点も注意が必要です。

Nextcloudドメイン変更 nextcloud.minokamo.xyz nextcloud.minokamo.tokyo 共有リンクがたくさんあるのでドメインを置換して維持する データベース操作ツール • MySQL Workbench • phpMyAdmin • SQL直接コマンド • Adminer

データベースを使用する主なCMS一覧

CMS名使用DB特徴
WordPressMySQL / MariaDB世界で最も使用されているCMS。豊富なプラグインとテーマ。
DrupalMySQL / PostgreSQL 他柔軟で拡張性が高く、大規模サイト向き。開発者向け。
Joomla!MySQL / PostgreSQL 他WordPressとDrupalの中間的存在。中〜上級者向け。
Typo3MySQL 他エンタープライズ向け。学習コストは高め。
Craft CMSMySQL開発者フレンドリーでカスタマイズ性が高い。
OctoberCMSMySQL / SQLite / PostgreSQLLaravelベースのCMS。シンプルで高速。
Concrete CMS (旧 Concrete5)MySQLブロックベースのUIで初心者でも操作しやすい。
MODXMySQL柔軟なテンプレートシステム。自由度が高い。

ECサイト構築ツール(ショッピングサイト)

ツール名使用DB特徴
Shopify(+アプリ連携)内部DB(クラウド)SaaS型。設定だけで始められる。
Magento (Adobe Commerce)MySQL超高機能、エンタープライズ向け。
WooCommerce(WordPressプラグイン)MySQLWordPressに組み込む形。
EC-CUBE(日本製)MySQL / PostgreSQL日本語対応がしっかりしている。

Webアプリケーションフレームワーク

これらはCMSではなく、Webサービスやアプリを構築するための土台です。

フレームワーク使用DB主な言語
LaravelMySQL / PostgreSQL 他PHP
Ruby on RailsSQLite / PostgreSQL 他Ruby
DjangoSQLite / PostgreSQL 他Python
Express + Sequelize/PrismaMySQL / PostgreSQL 他Node.js
Spring BootMySQL / Oracle 他Java

ノーコード / ローコードプラットフォーム

ツール名DBとの関係備考
Airtable独自のDB(表形式)表計算感覚でDB管理。APIも豊富。
Bubble独自DBノーコードでアプリ制作。視覚的に設計可能。
AppGyver / OutSystemsDBと連携可企業向けローコードプラットフォーム。

フォーラム / SNS / 掲示板などのWebアプリ

ツール名使用DB用途
DiscoursePostgreSQL高機能なフォーラム。
phpBBMySQL / PostgreSQL昔ながらの掲示板。
MastodonPostgreSQL分散型SNS。

Nextcloudのドメイン変更と共有リンクの挙動について

Nextcloudのドメインを変更する際の設定と、既存の共有リンクへの影響について解説します。

基本的な設定変更方法

調査しているとNextcloudのドメイン変更は、主にconfig.phpファイルの修正で対応できます。このファイルは例として図の様なディレクトリに配置されています。

Nextcloud config.phpの場所 /var/www/nextcloud config/ PHP config.php /var/www/nextcloud/config/config.php config.phpでのドメイン設定例: ‘overwrite.cli.url’ => ‘https://nextcloud.minokamo.tokyo’, ‘trusted_domains’ => array (0 => ‘nextcloud.minokamo.tokyo’,),

具体的には以下の部分を変更します。

'trusted_domains' => [
    0 => 'nextcloud.minokamo.xyz',  // 古いドメイン
],

を新しいドメインに変更:

'trusted_domains' => [
    0 => 'nextcloud.minokamo.tokyo',  // 新しいドメイン
],

ドメイン移行時の推奨設定

ドメイン移行期間中は、スムーズな移行のために一時的に両方のドメインを登録しておくことをお勧めします:

'trusted_domains' => [
    0 => 'nextcloud.minokamo.xyz',  // 古いドメイン
    1 => 'nextcloud.minokamo.tokyo',  // 新しいドメイン
],

さらに、新しいドメインでの運用に完全に移行するには、overwrite.cli.urlの設定も更新することが重要です:

'overwrite.cli.url' => 'https://nextcloud.minokamo.tokyo',

共有リンクの挙動について

Nextcloudのドメイン変更において、既存の共有リンクの挙動については以下のポイントが重要です:

朗報:適切な設定により共有リンクは新ドメインでも機能する

以下の設定を正しく行うことで、既存の共有リンクを新しいドメインでもそのまま利用できることが確認されています:

'trusted_domains' => [
    0 => 'nextcloud.minokamo.tokyo',  // 新しいドメインのみ設定
],
'overwrite.cli.url' => 'https://nextcloud.minokamo.tokyo',  // 新しいドメインを設定

この設定により、以下のような変換が自動的に行われます:

https://nextcloud.minokamo.xyz/index.php/s/ct82f4TADXjDQqQ

https://nextcloud.minokamo.tokyo/index.php/s/ct82f4TADXjDQqQ

仕組みの解説

Nextcloudでは、共有リンクのトークン部分(例: s/ct82f4TADXjDQqQ)がデータベースに保存されており、このトークンを基にしてリンクが生成されます。trusted_domainsoverwrite.cli.urlの設定が正しく行われていれば、システムは新しいドメインを使用してリンクを処理します。

重要なのは、共有トークン自体はドメインに依存せず、Nextcloudシステム内部で一意に管理されているという点です。そのため、適切な設定の下では、ドメインが変わっても同じトークンでアクセスできるようになります。

古いドメインが既に廃棄されている場合

古いドメインを既に廃棄している場合や、IPアドレスとの紐づけを解除している場合は、以下の点に注意が必要です:

1.新しいドメインのみの設定: この場合、trusted_domainsには新しいドメインのみを設定します:

'trusted_domains' => [
    0 => 'nextcloud.minokamo.tokyo',  // 新しいドメインのみ
],
'overwrite.cli.url' => 'https://nextcloud.minokamo.tokyo',

2.既存の共有リンクについて:

  • 古いドメインのリンクを保持していた利用者には、新しいドメインのURLを通知する必要があります
  • リンクのトークン部分(s/ct82f4TADXjDQqQ)は変わらないため、古いドメインから新しいドメインに置き換えるだけで利用可能です
  • 例: https://nextcloud.minokamo.xyz/...https://nextcloud.minokamo.tokyo/...

3.データベース変更について:

  • 大量の共有リンクがあり、一括で通知するのが難しい場合は、データベースのバックアップを取った上で、oc_shareテーブルなど関連テーブルの情報を確認・編集することも技術的には可能です
  • ただし、データベースの直接編集はリスクを伴うため、必ずバックアップを取った上で慎重に行いましょう。

注意点と確認事項

ドメイン変更時には、以下の点も併せて確認してください:

  1. SSL証明書: 新しいドメインに対応したSSL証明書が正しく設定されているか
  2. Webサーバー設定: Apache/Nginxの設定で新しいドメインが正しく設定されているか
  3. DNS設定: 新しいドメインが正しくサーバーIPを指しているか

Nextcloudのドメイン変更は、config.phptrusted_domainsoverwrite.cli.urlの設定を適切に行うことで、既存の共有リンクも新しいドメインでそのまま利用できます。

ドメイン移行の際には、一時的に両方のドメインをtrusted_domainsに登録しておき、移行完了後に古いドメインの設定を削除するという段階的なアプローチがおすすめです。

overwrite.cli.urlとは?

「overwrite.cli.url」はNextcloud がコマンドラインから実行される際や内部処理で生成するリンクの基準となるURLを上書きするための設定項目です。たとえば、Nextcloud をリバースプロキシの背後で運用している場合や、WebサーバーでのアクセスURLと実際のサーバー内部のURLが異なる場合に、このパラメーターで正しい外部向けのURLを指定することで、メール通知やリンク生成が正しく行われるようにします。

また、Nextcloud のインストール時には、環境やアクセス方法に応じて自動的に設定される場合もありますが、必ずしも全ての環境で必須というわけではありません。必要に応じて、後から手動で追加・変更することも可能です。

overwritehostとは?

「overwritehost」は、Nextcloud が自動的に検出するホスト名の代わりに、特定のホスト名を強制的に使用するための設定です。
例えば、リバースプロキシの背後で運用している場合、内部でのリクエストと外部でアクセスされるURLが異なることがあるため、このオプションを使って外部に公開する正しいホスト名を指定することで、リンク生成やリダイレクトなどの動作を正しく行わせることができます。

また、デフォルトのインストール時には「overwritehost」の設定は存在せず、必要な場合に手動でconfig.phpに追加するオプションです。

実践で遭遇した問題と対応策:「この操作は禁止されています」エラー

ドメイン変更後、一見すると共有リンクは新しいドメインでアクセスできるように見えても、実際にファイルを操作しようとすると「この操作は禁止されています」(英語では「this operation is forbidden」)というエラーメッセージが表示されることがあります。

これは、Nextcloud内部のデータベースに古いドメイン情報が残っているために発生する問題です。旧ドメインの場合は正常に表示されるため、Nextcloud内部で使用される一部のリンクやリクエストに、まだ旧ドメインの情報が残っていることが原因です。

古いドメイン情報を特定する

PHPMyAdminなどのデータベース管理ツールを使用して、古いドメインが保存されている場所を特定する手順は以下の通りです:

1.PHPMyAdminにログインし、Nextcloudのデータベースを選択します

2.全テーブルを対象に古いドメインを検索します:

  • 「検索」機能を使用し、「検索する文字列」に古いドメイン(例:nextcloud.minokamo.xyz)を入力
  • または以下のようなSQLクエリを実行:
SELECT TABLE_NAME 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = 'your_nextcloud_db'
  • 各テーブルに対して次のようなクエリを実行:
SELECT * FROM table_name 
WHERE some_column LIKE '%nextcloud.minokamo.xyz%';

3.実際の検索結果

0 件の一致 (テーブル oc_accounts)
0 件の一致 (テーブル oc_accounts_data)
19031 件の一致 (テーブル oc_activity) 表示 削除
0 件の一致 (テーブル oc_activity_mq)
0 件の一致 (テーブル oc_addressbookchanges)
0 件の一致 (テーブル oc_addressbooks)
0 件の一致 (テーブル oc_appconfig)
0 件の一致 (テーブル oc_appconfig_ex)
0 件の一致 (テーブル oc_authorized_groups)
0 件の一致 (テーブル oc_authtoken)
0 件の一致 (テーブル oc_bruteforce_attempts)
0 件の一致 (テーブル oc_calendarchanges)
0 件の一致 (テーブル oc_calendarobjects)
0 件の一致 (テーブル oc_calendarobjects_props)
0 件の一致 (テーブル oc_calendars)
0 件の一致 (テーブル oc_calendarsubscriptions)
0 件の一致 (テーブル oc_calendar_appt_bookings)
0 件の一致 (テーブル oc_calendar_appt_configs)
0 件の一致 (テーブル oc_calendar_invitations)
0 件の一致 (テーブル oc_calendar_reminders)
0 件の一致 (テーブル oc_calendar_resources)
0 件の一致 (テーブル oc_calendar_resources_md)
0 件の一致 (テーブル oc_calendar_rooms)
0 件の一致 (テーブル oc_calendar_rooms_md)
0 件の一致 (テーブル oc_cards)
2 件の一致 (テーブル oc_cards_properties) 表示 削除
0 件の一致 (テーブル oc_circles_circle)

  • oc_activityテーブル: 19,031件の一致
  • oc_cards_propertiesテーブル: 2件の一致
  • その他のテーブルでは一致なし

検索結果の詳細と必要なカラムの特定

Nextcloudのデータベースを検索した結果、以下のテーブルとカラムに古いドメイン情報が含まれていることが判明しました:

oc_activityテーブル

  • subject
  • subjectparams
  • message
  • messageparams
  • file
  • link

oc_cards_propertiesテーブル

  • value

実際のPHPMyAdminでの検索クエリは以下のようになります:

SELECT * FROM `LAA1624080-nc`.`oc_activity`
WHERE (CONVERT(`activity_id` USING utf8) LIKE ‘%nextcloud.minokamo.xyz%’
OR CONVERT(`timestamp` USING utf8) LIKE ‘%nextcloud.minokamo.xyz%’
OR CONVERT(`priority` USING utf8) LIKE ‘%nextcloud.minokamo.xyz%’
OR CONVERT(`type` USING utf8) LIKE ‘%nextcloud.minokamo.xyz%’
OR CONVERT(`user` USING utf8) LIKE ‘%nextcloud.minokamo.xyz%’
OR CONVERT(`affecteduser` USING utf8) LIKE ‘%nextcloud.minokamo.xyz%’
OR CONVERT(`app` USING utf8) LIKE ‘%nextcloud.minokamo.xyz%’
OR CONVERT(`subject` USING utf8) LIKE ‘%nextcloud.minokamo.xyz%’
OR CONVERT(`subjectparams` USING utf8) LIKE ‘%nextcloud.minokamo.xyz%’
OR CONVERT(`message` USING utf8) LIKE ‘%nextcloud.minokamo.xyz%’
OR CONVERT(`messageparams` USING utf8) LIKE ‘%nextcloud.minokamo.xyz%’
OR CONVERT(`file` USING utf8) LIKE ‘%nextcloud.minokamo.xyz%’
OR CONVERT(`link` USING utf8) LIKE ‘%nextcloud.minokamo.xyz%’
OR CONVERT(`object_type` USING utf8) LIKE ‘%nextcloud.minokamo.xyz%’
OR CONVERT(`object_id` USING utf8) LIKE ‘%nextcloud.minokamo.xyz%’)

問題の解決方法:データベース内の置換

特定したテーブル内の古いドメイン情報を新しいドメインに置換するには、以下のSQLクエリを使用します(実行前に必ずデータベースのバックアップを取ってください):

-- oc_activityテーブルの更新(すべての関連カラムを対象に)
UPDATE oc_activity
SET 
  subject = REPLACE(subject, 'nextcloud.minokamo.xyz', 'nextcloud.minokamo.tokyo'),
  subjectparams = REPLACE(subjectparams, 'nextcloud.minokamo.xyz', 'nextcloud.minokamo.tokyo'),
  message = REPLACE(message, 'nextcloud.minokamo.xyz', 'nextcloud.minokamo.tokyo'),
  messageparams = REPLACE(messageparams, 'nextcloud.minokamo.xyz', 'nextcloud.minokamo.tokyo'),
  link = REPLACE(link, 'nextcloud.minokamo.xyz', 'nextcloud.minokamo.tokyo'),
  file = REPLACE(file, 'nextcloud.minokamo.xyz', 'nextcloud.minokamo.tokyo')
WHERE 
  subject LIKE '%nextcloud.minokamo.xyz%' OR 
  subjectparams LIKE '%nextcloud.minokamo.xyz%' OR 
  message LIKE '%nextcloud.minokamo.xyz%' OR 
  messageparams LIKE '%nextcloud.minokamo.xyz%' OR 
  link LIKE '%nextcloud.minokamo.xyz%' OR 
  file LIKE '%nextcloud.minokamo.xyz%';

-- oc_cards_propertiesテーブルの更新
UPDATE oc_cards_properties
SET value = REPLACE(value, 'nextcloud.minokamo.xyz', 'nextcloud.minokamo.tokyo')
WHERE value LIKE '%nextcloud.minokamo.xyz%';

これらのクエリを実行するには、PHPMyAdminの「SQL」タブを使用します:

  1. PHPMyAdminにログインし、Nextcloud用のデータベースを選択
  2. 上部の「SQL」タブをクリック
  3. クエリを入力して「実行」ボタンをクリック
  4. 更新されたレコード数が表示されることを確認
  5. 再度検索クエリを実行して、置換が成功したか確認

場合によっては、他のテーブルにも古いドメイン情報が残っている可能性があります。各環境に合わせて検索し、必要に応じて更新してください。

「この操作は禁止されています」エラーが続く場合の追加対策

データベース内の古いドメイン情報を置換した後も「この操作は禁止されています」(「this operation is forbidden」)エラーが表示される場合、以下の追加対策を検討してください:

Web Application Firewall(WAF)の確認

実践的な検証の結果、すべてのデータベース置換を正しく行っても、ファイルアクセス時にエラーが表示される場合があります。この問題は、Web Application Firewall(WAF)の設定が原因である可能性があります:

  1. レンタルサーバーやホスティングサービスでWAFが有効になっている場合、ドメイン変更後に新しいドメインでのアクセスをWAFが不適切にブロックしていることがあります
  2. 一時的にWAFを無効にするか、新しいドメインのアクセスを許可するようWAFの設定を調整してください
  3. WAFの無効化はセキュリティリスクを伴うため、必要な調整を行った後は再度有効にすることをお勧めします

重要な注意点

  • データベースを直接編集する前に必ずバックアップを取ってください
  • レンタルサーバーなど制限のある環境では、データベースのバックアップと復元方法を事前に確認しておくことをお勧めします
  • 更新作業は可能な限りメンテナンス時間中に行い、ユーザーの作業に影響が出ないようにしてください
  • 各クエリを実行する前に、影響を受けるレコード数を確認するSELECTクエリでテストすることをお勧めします
  • WAFの設定を変更する場合は、セキュリティ上のリスクを理解した上で、必要最小限の変更にとどめてください

注意点と確認事項

ドメイン変更時には、以下の点も併せて確認してください:

  1. SSL証明書: 新しいドメインに対応したSSL証明書が正しく設定されているか
  2. Webサーバー設定: Apache/Nginxの設定で新しいドメインが正しく設定されているか
  3. DNS設定: 新しいドメインが正しくサーバーIPを指しているか

まとめ

Nextcloudのドメイン変更は、表面的にはconfig.phptrusted_domainsoverwrite.cli.urlの設定変更だけで済むように見えますが、実際には内部データベースにも古いドメイン情報が残っている可能性があります。

完全なドメイン移行のためには:

  1. 基本設定の変更: config.phptrusted_domainsoverwrite.cli.urlを更新
  2. 移行期間の対応: 一時的に両方のドメインをtrusted_domainsに登録
  3. データベース内の古いドメイン情報の検出と更新: 特にoc_activityテーブルなどを確認
  4. 動作確認: 共有リンクでのファイル操作が正常に行えるか確認

これらのステップを慎重に実施することで、スムーズなドメイン移行が可能になります。特に重要なシステムや多数の共有リンクを使用している環境では、事前にテスト環境でのドメイン変更検証もお勧めします。

Nextcloudドメイン変更の流れと問題解決 初期状態 ドメイン: nextcloud.minokamo.xyz 共有リンク: https://nextcloud.minokamo.xyz/index.php/s/ct82f4TADXjDQqQ config.php の設定変更 ‘trusted_domains’ => [ 0 => ‘nextcloud.minokamo.tokyo’ ] ‘overwrite.cli.url’ => ‘https://nextcloud.minokamo.tokyo’ 問題発生 共有リンクは新ドメインでアクセス可能だが「この操作は禁止されています」エラー 内部DB・WAFの設定が原因 解決策 1. DBテーブル(oc_activity等)内の古いドメインを置換 + 2. WAF設定の調整

ロリポップでサブドメインの作成について

似たようなnextcloudという名前であり、混乱しそうですが落ち着いて進めていきます。問題は、ロリポップで公開 (アップロード) フォルダを同じにするとどうなるか心配なので、一度別のファイルがあまりないフォルダを複製しておき作成のテストをしてみました。以下のように表示されます。

公開 (アップロード) フォルダ【 betelstar 】は下記ドメインが利用しています。

  • http://star.betelgeuse.work/

このまま設定した場合、http://test.minokamo.xyz/ では上記ドメインと同じ内容が表示されます。

しかし、そのまま設定してもフォルダが新規で作成され、フォルダが空になることはありませんでした。これが心配だったのです。ですのでnextcloudという同じ公開 (アップロード) フォルダを2重で作成しても問題はなさそうです。

IPアドレスとドメインの紐づけ

まずはIPアドレスとドメインの紐づけをします。同じIPアドレスに複数のドメインを紐づけるのは問題ありません。

現在の設定: nextcloud.minokamo.xyz → 118.27.125.232

新しく設定したいのは: nextcloud.minokamo.tokyo → 118.27.125.232

DNSの設定変更の手順としては:

新しいドメイン(nextcloud.minokamo.tokyo)のAレコードを作成
Type: A
Name: nextcloud
Value: 118.27.125.232

DNSの伝播を待つ(通常15分〜48時間)
dig nextcloud.minokamo.tokyo や nslookup nextcloud.minokamo.tokyo で確認できます

新ドメインでアクセスできることを確認

必要に応じて、古いドメイン(nextcloud.minokamo.xyz)の設定は残しておく
移行期間中は両方のドメインが使えるようにしておくと安全です

タイトルとURLをコピーしました