読者です 読者をやめる 読者になる 読者になる

interprism's blog

インタープリズム株式会社の開発者ブログです。

Windows上のApacheでDocumentRootにシンボリックリンクを指定する

こんにちは、kamogawaです。情報ダイエットが進みません。

さて、今回JavaScriptの動作確認のためにローカルホストのWebサーバが必要になった*1ので、Windows 7上にApacheをセットアップしました。

Apacheで公開するファイルを常にGoogleドライブにも同期しよう*2と考えたのですが、その設定につまづいたので、解決策を共有しておきます。大まかな流れとしては、

  1. Googleドライブ内のフォルダへのシンボリックリンクの作成
  2. ApacheのDocumentRootの指定
  3. リンク先フォルダのアクセス許可の設定

となります。情報として一番有用なのは最後のアクセス許可の設定だと思われます。

環境と問題の確認

環境は、

です。

さらに日本語環境の場合、Googleドライブの同期フォルダはデフォルトでは以下のようなパスになっていると思います。(ユーザー名kamogawaの場合)

C:\Users\kamogawa\Google ドライブ

作成したWebページのファイルを「Apacheで公開し、かつGoogleドライブに同期させたい」といった場合、そのファイルを含むフォルダをGoogleドライブ下に置き、ApacheのDocumentRootに指定すれば解決するはずですが、ApacheのDocumentRoot設定に日本語を含むパスが使えないという問題があります。

今回はこの問題を、Googleドライブ内のフォルダへのシンボリックリンクを貼り、そのリンクをApacheのDocumentRootに指定することで解決しました。(この記事を書くまで思いつきませんでしたが、日本語のフォルダ名自体を変えられるならば、それを変えてしまう方が速いです……。Googleドライブもフォルダ名変更が可能なようです。

以下、設定手順です。

Googleドライブ内のフォルダへのシンボリックリンクの作成

まず、目的のフォルダへのシンボリックリンクを作成します。ショートカットが単にリンク先を記したファイルであるのに対し、シンボリックリンクはリンク先と同様に扱うことができ、Apacheからも参照可能です。

コマンドプロンプトから以下のコマンドで作成することができます。

mklink /D <dest path> <src path>

今回の場合、<dest path>にDocumentRootに設定するシンボリックリンクフォルダ、<src path>にGoogleドライブのフォルダを指定します。そのほか注意することは、以下。

  • シンボリックリンクフォルダは新規作成されるので、<dest path>には存在しないフォルダ名を指定する。
  • フォルダ名にスペースを含む場合は、パスをダブルクォートで囲む。
  • mklinkコマンドでのシンボリックリンクの作成には、管理者権限が必要。コマンドプロンプトを管理者権限で起動してコマンドを実行する。

作成したら、エクスプローラーなどでリンクが問題ないか確認しましょう。

ApacheのDocumentRootの指定

次に作成したシンボリックリンクApacheのDocumentRootに指定します。

Apacheをインストールしたフォルダのconf\httpd.confファイルの一部を編集。

  • 編集前(Cドライブ直下にインストールした場合)
DocumentRoot "c:/Apache24/htdocs"
<Directory "c:/Apache24/htdocs">
  • 編集後(デフォルトのフォルダに作成したリンクを置く場合)
DocumentRoot "c:/Apache24/htdocs/作成したシンボリックリンクフォルダ"
<Directory "c:/Apache24/htdocs/作成したシンボリックフォルダ">

編集したらApacheを再起動します。コマンドプロンプトで再起動する場合は、管理者権限が必要な場合があるので注意してください。きちんと再起動できているか確認するには、タスクマネージャーのプロセスタブでhttpd.exeのプロセスを眺めながらコマンドを打つとよいです。

環境によっては、この段階ですでにうまく動作するかもしれません。

リンク先フォルダのアクセス許可の設定

最後にリンク先フォルダのアクセス権を確認します。

ここまでの設定が終わっている状態で、ブラウザからアクセスして「Forbidden」となる場合は、シンボリックリンクのリンク先のフォルダのアクセス権が適切に設定されていない可能性が高いです。

f:id:interprism:20150909114733j:plain:w400

Linuxパーミッションとは異なるらしいのですが、Windowsのフォルダ・ファイルにはアクセス権が存在します。シンボリックリンクのリンク先のフォルダのアクセス権の設定が不適切なために、Apacheからアクセスできず、「Forbidden」となっているものと思われます。

アクセス許可の設定手順

では、そのアクセス権を修正します。対象フォルダのアクセス権に「Authenticated Users」もしくは「SYSTEM」どちらかの読み取り許可を追加します*3

  1. シンボリックフォルダのリンク先フォルダ(今回の例では<src path>)のプロパティを開く。
    f:id:interprism:20150909114843j:plain:h400
  2. セキュリティタブに移動し、「グループ名またはユーザー名」の欄に「Authenticated Users」と「SYSTEM」がないことを確認。「編集」をクリック。
    f:id:interprism:20150909114856j:plain:h400
  3. 開いたウィンドウで、追加をクリック、さらに開いたウィンドウで、「system」と入力し、「OK」をクリック。
    f:id:interprism:20150909114911j:plain
  4. 「SYSTEM」のアクセス許可に読み取り許可があることを確認し、「OK」をクリック。
    f:id:interprism:20150909114933j:plain:h400
  5. ブラウザからアクセスできるようになったことを確認。

以上でWindows 7上のApacheにおける、DocumentRootへのシンボリックリンクの設定は完了です。お疲れ様でした。

おまけ

あらためて検索してみると、Linux環境では割と事例がある様子。いずれもパーミッションの修正で解決。

結論

素直に仮想マシン上のLinuxを使いましょう。

*1:Ajaxのため。Chromeではセキュリティ対策で、XMLHttpRequestはfileプロトコル(file://~)でローカルのファイルをGETできない。よってWebサーバーなどが必要。

*2:Googleドライブを会社で使える!

*3:管理者権限で起動したコマンドプロンプトApacheを起動すると、httpdプロセスのユーザーがSYSTEMになっていることがタスクマネージャーから確認できる。よってリンク先フォルダは少なくともSYSTEMの読み取り許可を持っている必要があると考えられる。

PAGE TOP