サイトルート相対パスで指定した画像やCSSもDreamweaverのリアルタイムプレビューで読み込ませるようにする方法

HTMLのimgタグやscriptタグのsrc属性、aタグやlinkタグのhref属性に記述するパス名をスラッシュ「/」で始まる「サイトルート相対パス」で書いた場合、Dreamweaverでは特に何も設定していないと、サイトをリアルタイムプレビューした時に画像が表示されず、CSSも読み込まれない酷い表示になってしまいます。このままでは、サイトルート相対パスで書かなければならないコーディング案件でのデバッグ作業に支障が出るため、MacのDreamweaverでプレビューする方法を調べました。解決したものの、設定箇所や項目の関係、仕組みがちょっとわかりにくくハマったので、設定手順をここに書きます。

**動作環境**

* macOS Mojave 10.14
* Adobe Dreamweaver 2019
* Apache HTTP server 2.4 (macOS標準搭載のもの）

## サンプルのフォルダ構成と表示例
この記事では例として以下のフォルダ構成で作業するものとします。
![fig_01@1.5x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469745/7104375e-f9e2-3829-8754-a1d4e24c4a5d.png)

* ~/Desktop/my-project/source  
サイトの編集作業用のフォルダ
* http\://localhost/foo/mycoolsite/  
テストサイトのURL
* ~/Desktop/htdocs  
Apache httpdのDocumentRoot
* ~/Desktop/htdocs/foo/mycoolsite  
~/Desktop/my-project/source へのシンボリックリンク

出来上がりのプレビュー表示は下図のようになります。ChromeのDevToolsで表示したソース（下側）を見てわかるとおり、/foo/mycoolsite/ で始まるサイトルート相対パスで指定したCSSファイルやimgのsrc画像が正しくロードできています。また、リアルタイムプレビューがiframeにロードするindex.htmlファイルの取得先URLが http\://localhost/foo/mycoolsite/index.html になっているのも確認できます。
![complete_preview@1.5x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469745/de28fe97-8551-1991-6c1c-8267643d4a91.png)


## 設定手順
### Apache httpdの設定と起動
始めにApache httpdをローカルサーバーとして構成し、起動します。設定方法は[こちらの記事](https://qiita.com/kazhashimoto/items/16ed325abdbb0ab10909)の終わりに書きました。なお、シンボリックリンクによるファイル参照を可能にするため、DocumentRootに対する\<Directory>ディレクティブで、`Options FollowSymLinks`を有効にしておく必要があります。

### Dreamweaverの設定
Dreamweaverでサイトを開き、「ファイル」パネル右上にある「サーバーを定義」ボタンをクリックし、「サイト設定」画面の「サーバー」項目を表示します（下図）。パネルに「サーバーを定義」が表示されていない場合は、アプリケーションバーの「サイト」-「サイトの管理」から当該サイトの編集でこのダイアログボックスを表示できます。
![fig_02@1.5x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469745/54c19a25-fd56-0eb9-8c01-c9a92448fc28.png)

サーバーリストの左下「+」をクリックし、サーバーの設定画面を表示します。「基本」タブで、「使用する接続」プルダウンメニューから**ローカル/ネットワーク**を選択します（下図）。そのほかの項目の入力は以下のとおりです。

**基本タブ**

| 項目 | 入力 |
|:--|:--|
|  サーバー名 |  任意の名前。この例では、localhostとしています。 |
| サーバーフォルダー  |  サイトの編集作業用のフォルダー(Dreamweaverで作業する場所）のパス。この例では、~/Desktop/my-project/source としています。 |
|  Web URL |  テストサイトのURL。この例では、http\://localhost/foo/mycoolsite/ としています。 |

**詳細タブ**
「テストサーバー」欄の「テストサーバーにファイルを自動的にプッシュ」のチェックを外します（使わないので念のために）。そのほかの項目はデフォルトのままで構いません。
![fig_03@1.5x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469745/46d8adba-ff74-c7f8-8a7e-d42f0546a498.png)

「保存」をクリックしてサイト設定画面に戻ると、上で設定したサーバー情報がサーバーリストに追加されています（下図）。次に、右端のラジオボタンで**「テスト」の方を選択します**。ここが肝心で、リモート(デフォルト）のままだとプレビューでサイトルート相対パスの画像を表示できません！
![fig_04@1.5x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469745/40ba4bbb-07cd-c5a5-2938-4c5688852d19.png)

サーバーの設定を変更したら、変更を反映するためサイトキャッシュを再作成します。
![site_cache.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469745/d9d4e538-19cd-524e-d648-78d9aeb9bfc3.png)

以上で設定は完了です。リアルタイムプレビューで表示してみましょう。

### 検証方法
サイトルート相対パスで指定した画像などのファイルについて、リアルタイムプレビューが実際にデータをhttpdから取得しているかどうかは、次のようにして確認できます。リアルタイムプレビューでChromeを起動し、DevToolsを開きNetworkタブに移動します。Disable cacheにチェックを入れた状態でページを再読み込みさせます。次にApacheのaccess_logを見て、当該ファイルに対するGETリクエストをstatus 200で応答しているかを確認します。
![fig_05@1.5x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469745/ac50e8f0-eb68-b5dc-6454-1c7bb1447543.png)

ところで、前述したDreamweaver「サイト設定」画面のサーバーリストのラジオボタンで、**「テスト」に設定し忘れた場合**(つまり**リモート**の場合）どうなるでしょうか？ 結果は下図のように、サイトルート相対パスのデータの取得に失敗(404エラー）します。ファイル名にマウスを乗せてURLを表示すると、サーバーのport番号がApache httpdの待ち受けに設定したポート番号ではないことが判ります。このport番号は、Dreamweaverのデバイスプレビューサービスの[ノードサーバーがランダムに割り当てたポート番号](https://helpx.adobe.com/jp/dreamweaver/using/device-preview-troubleshooting.html)であり、Apacheへの接続ではありません。

![fig_07@1.5x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469745/3a85bc8b-ef82-2323-b7bb-76b4361fbc34.png)

## Dreamweaverのサイト設定で指定する「相対リンク」はどこに効く？
最初私がハマったのはココです。Dreamwearverの「サイト設定」画面 で、「詳細設定」ー「ローカル情報」に**相対リンク**として**サイトルート**を選択できる項目があり、ここにも「Web URL」の入力があります（下図）。ところが、「ローカル情報」を設定してもリアルタイムプレビューでサイトルート相対パスの画像を表示させることはできません。では一体何に使われるものでしょうか？ 
![fig_06@1.5x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469745/84162cc0-211f-1b65-81de-a86deb95a1f7.png)

実はこれらの設定項目は、Dreamweaverでサイトのリンクを（ローカルに）チェックする時に使われます。
![link_check.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469745/9b191fe9-911d-8375-c1df-0280101c3922.png)

試しに、先ほど載せたウチのわんこのページで\<a>要素のhrefに指定しているサイトルート相対パスの一部を、次のように存在しないパス名に変更して「リンクチェック」を実行してみました。
例）
/foo/mycoolsite/img/mydog.jpg を
/**bar**/mycoolsite/img/mydog.jpg に書き換え

「リンクチェック」パネルで**外部リンク**を選んでチェックを実行すると、/bar/... で始まるリンクの方が検出されました（下図）。つまり、これらのリンクは、ローカル情報の「Web URL」に設定したURLに照らして“外部”にあるとみなされたということです。
![fig_08@1.5x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469745/4597eb0e-ba85-1f36-d99f-36022a1600aa.png)

## 追記: ブラウザにキャッシュさせない方法
Apache経由でリアルタイムプレビューした場合に１つ不便な点（注意点）があります。DreamweaverでHTMLやCSSファイルを編集してブラウザで再読み込みしても変更内容が画面に反映されないことが多いので、その場合はいちいちDevToolsのNetworkタブを開き、Disable cacheにチェックを入れた状態でページを再読み込みさせる必要があります。
対策は、Apache側からキャッシュを使わせないよう強制することです。こちらの記事を参考にさせていただきました。

[Apacheから強制的にキャッシュを使わせないようにする方法](https://ameblo.jp/itboy/entry-11392756539.html)

設定方法は、`httpd.conf`で`mod_headers.so`を有効にして、

```
LoadModule headers_module libexec/apache2/mod_headers.so
```

以下の３行を追加します。

```
FileEtag None
RequestHeader unset If-Modified-Since
Header set Cache-Control no-store
```

試したところ、PCのブラウザ(Chrome/Firefox/IE/Edge)では効果がありましたが、スマホ(Android)のChromeはキャッシュがしぶとくて効果がなく、履歴を削除しないとダメでした。