[macOS] スタンドアロンの FileMaker Pro と localhost との連携 vol.2

## 使用環境

- Claris FileMaker Pro 21.1.41 (macOS)
- macOS Sequoia 15.3.1

## macOS 標準の Apache の起動

　単に以下のコマンドをターミナルで実行するだけです。

```.sh:ターミナル
sudo apachectl start
```

　`http://localhost/`、`http://127.0.0.1/` またはシステム設定で設定したローカルホスト名を使用してアクセスできます。

 成功すると、**It works!** と表示されます。これはデフォルトでドキュメントルートが、`/Library/WebServer/Documents/` に設定されており、そこにある `index.html.en` が表示されているからです。

## 編集の準備

 ドキュメントルートがデフォルトの状態では扱い難いので、新しいドキュメントルートを作っておきます。Mac 風のディレクトリをユーザディレクトリ直下に置いて、そこから3階層くらい下をドキュメントルートにすると、後々、都合が良いでしょう。ここでは、以下のようにしました。

```.sh:ターミナル
mkdir ~/Sites/
mkdir ~/Sites/WebServer/
mkdir ~/Sites/WebServer/Documents/
```

 ここで作った `~/Sites/WebServer/Documents/` を新しいドキュメントルートにします。

　ついでに、Finder で見るときに、いちいち、3階層下まで行くのは面倒なので、ユーザディレクトリ直下にシンボリックリンクを作っておきます。

```.sh:ターミナル
ln -s ~/Sites/WebServer/Documents ~/htdocs
```

 `htdocs` の部分は、`public_html` でも何でも構いません。

## version 1 〜 作成したドキュメントルートで、動くようにする

 この部分は、macOS のバージョンによって違うようなので、まずバックアップを作って、その後、確認します。
```.sh:ターミナル
cd /etc/apache2/
sudo cp httpd.conf httpd.conf_default
sudo vi httpd.conf
```

 大文字 `G` と入力し、最下行を確認します。
```.conf:httpd.conf
Include /private/etc/apache2/other/*.conf
```
 上記のようにコメントアウトされていなければ問題ありません。

　次に、設定ファイルを順番に作成していきます。まず、設定ファイルを置くディレクトリに移動し、設定ファイルを作ります。ファイル名は何でも構いません。

```.sh:ターミナル
cd /etc/apache2/other/
sudo vi fm_website.conf
```

 インサートモード `i` で以下のように入力します。

```.sh:fm_website.conf : version 1
LoadModule rewrite_module libexec/apache2/mod_rewrite.so

DocumentRoot "/Users/（Macのユーザ名）/Sites/WebServer/Documents"
<Directory "/Users/（Macのユーザ名）/Sites/WebServer/Documents">
    Options Indexes FollowSymLinks Multiviews
    MultiviewsMatch Any

    AllowOverride All

    Require all granted
</Directory>
```

 コマンドモード `esc` で、保存終了 `:wq` し、Apache を再起動します。

 ```.sh:ターミナル
sudo apachectl restart
```

 `http://localhost/` で今度は、**Index of /** と表示されれば、成功です。

 `~/Sites/WebServer/Documents/` に HTML/CSS、JavaScript のファイルを置けば動作するはずです。

## version 2 〜 PHP を動作させる

　次に PHP ですが、Mac の Apache は未署名の外部モジュールは動作しないので、認証局を作成し、PHP のモジュールにコード署名をする必要があります。
 これについては、[この記事](https://qiita.com/RemixWorksLLC/items/bfe1a6385c7447437de3) に書いてありますので、参考にしてください。
 記事は、FileMaker Server に関するものなので、認証局とコード署名だけすればいいです。

 コード署名が無事できたとして、Homebrew でインストールした PHP 8 という前提で、version 2 を書いてみます。

```.sh:fm_website.conf : version 2
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
LoadModule php_module /opt/homebrew/opt/php/lib/httpd/modules/libphp.so "（コード署名の名称）"

DocumentRoot "/Users/（Macのユーザ名）/Sites/WebServer/Documents"
<Directory "/Users/（Macのユーザ名）/Sites/WebServer/Documents">
    Options Indexes FollowSymLinks Multiviews
    MultiviewsMatch Any

    AllowOverride All

    Require all granted
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

<IfModule php_module>
	AddType application/x-httpd-php .php
	AddType application/x-httpd-php-source .phps
</IfModule>
```

 Apache を再起動します。
```.sh:ターミナル
sudo apachectl restart
```

　これで、PHP が動作するので、確認します。
```.php:~/Sites/WebServer/Documents/phpinfo.php
<?php phpinfo();
```
 `http://localhost/phpinfo.php` で、PHP の情報が表示されれば成功です。

## version 3 〜 CGI を動かす

 Perl 等の言語で、CGI を動かすことができます。Perl を動作させて、CGI を動作させてみましょう。

```.sh:fm_website.conf : version 3
LoadModule mpm_prefork_module libexec/apache2/mod_mpm_prefork.so
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
LoadModule php_module /opt/homebrew/opt/php/lib/httpd/modules/libphp.so "（コード署名の名称）"

<IfModule mpm_prefork_module>
	LoadModule cgi_module libexec/apache2/mod_cgi.so
</IfModule>
LoadModule perl_module libexec/apache2/mod_perl.so

DocumentRoot "/Users/（Macのユーザ名）/Sites/WebServer/Documents"
<Directory "/Users/（Macのユーザ名）/Sites/WebServer/Documents">
    Options Indexes FollowSymLinks Multiviews ExecCGI
    MultiviewsMatch Any

    AllowOverride All

    Require all granted
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html index.php index.cgi
</IfModule>

<IfModule mime_module>
	AddHandler cgi-script .cgi .pl .py .rb .R
</IfModule>

<IfModule php_module>
	AddType application/x-httpd-php .php
	AddType application/x-httpd-php-source .phps
</IfModule>
```

 Apache を再起動します。
```.sh:ターミナル
sudo apachectl restart
```

　CGI プログラミングに使用する言語は、何でもいいですが、まず、Perl で確認してみます。
 Perl のパスを確認しておきましょう。

```.sh:ターミナル
which perl
```

 私の環境では、`/usr/local/bin/perl` となっていましたので、それで書きます。
 拡張子は、`.cgi` でも、`.pl` でも動作する設定にしています。

```.pl:~/Sites/WebServer/Documents/hello-world.pl
#!/usr/local/bin/perl

print "Content-type: text/html\n\n";

my $hello_world = << "_HTML";
<h1>Hello, world!</h1>
_HTML

print $hello_world;

exit;
```

 次に、CGI ファイルには実行権限が必要なので、このファイルに実行権限を与えます。
```
chmod 705 ~/Sites/WebServer/Documents/hello-world.pl
```

 `http://localhost/hello-world.pl` で、**Hello, world!** と表示されれば成功です。

  Hello, world! くらいですから、他言語も実験しておきましょう。
  各ファイルには実行権限を与えることを忘れないということと、PATH に関しては環境に依存しますので、適宜、書き換えてください。

### Python 3
```.py:~/Sites/WebServer/Documents/hello-world.py
#!/usr/bin/python3

print("Content-type: text/html\n\n")
print("<h1>Hello, world!</h1>\n")
```

### R
```.R:~/Sites/WebServer/Documents/hello-world.R
#!/usr/local/bin/Rscript

cat("Content-type: text/html\n\n")
cat("<h1>Hello, world!</h1>\n")
quit()
```

### Node.js
```.cgi:~/Sites/WebServer/Documents/hello-world-node.cgi
#!/usr/local/bin/node

	console.log('Content-type: text/html');
	console.log('');
	
	console.log("\
<h1>Hello, world!</h1>\
");
```

### Ruby
```.rb:~/Sites/WebServer/Documents/hello-world.rb
#!/usr/bin/env ruby

print "Content-type: text/html\n\n"
print "<h1>Hello, world!</h1>"
```

 スタンドアロンの FileMaker Pro のレイアウトとして使うのであって、Web ホスティングをするわけではないので、CGI で何でもありの姿勢でいいと思います。

## version 4 〜 SSI も一応

 30年前くらいなら、Web の訪問カウンタなんかで利用されてましたが、現代では、あんまり積極的に利用することもないでしょうけど、一応、設定だけ書いておきます。
 version 3 でとどめておいて、まったく問題ありません。

```.sh:fm_website.conf : version 4
LoadModule mpm_prefork_module libexec/apache2/mod_mpm_prefork.so
LoadModule include_module libexec/apache2/mod_include.so
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
LoadModule php_module /opt/homebrew/opt/php/lib/httpd/modules/libphp.so "（コード署名の名称）"

<IfModule mpm_prefork_module>
	LoadModule cgi_module libexec/apache2/mod_cgi.so
</IfModule>
LoadModule perl_module libexec/apache2/mod_perl.so

DocumentRoot "/Users/（Macのユーザ名）/Sites/WebServer/Documents"
<Directory "/Users/（Macのユーザ名）/Sites/WebServer/Documents">
    Options Indexes FollowSymLinks Multiviews ExecCGI Includes
    MultiviewsMatch Any

    AllowOverride All

    Require all granted
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html index.php index.cgi index.shtml
</IfModule>

<IfModule mime_module>
	AddHandler cgi-script .cgi .pl .py .rb .R
	AddType text/html .shtml
	AddOutputFilter INCLUDES .shtml
</IfModule>

<IfModule php_module>
	AddType application/x-httpd-php .php
	AddType application/x-httpd-php-source .phps
</IfModule>
```

 Apache を再起動します。
```.sh:ターミナル
sudo apachectl restart
```

 拡張子 `.shtml` で、SSI が動作する設定です。

 テストファイルです。
```.html:~/Sites/WebServer/Documents/ssi-test.shtml
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>SSI Environment Test</title>
</head>
<body>
<h1>Welcome to my server at
<!--#echo var="SERVER_NAME"--></h1>
<!--#config timefmt="%m/%d/%H:%M:%S" -->
<!--#echo var="DATE_LOCAL" -->
<table>
    <tr>
        <th></th>
        <th class="first_column">SSI</th>
    </tr>
    <tr>
        <th>DATE_GMT</th>
        <td><!--#echo var="DATE_GMT"--></td>
    </tr>
    <tr>
        <th>DATE_LOCAL</th>
        <td><!--#echo var="DATE_LOCAL"--></td>
    </tr>
    <tr>
        <th>DOCUMENT_NAME</th>
        <td><!--#echo var="DOCUMENT_NAME"--></td>
    </tr>
    <tr>
        <th>DOCUMENT_URI</th>
        <td><!--#echo var="DOCUMENT_URI"--></td>
    </tr>
    <tr>
        <th>LAST_MODIFIED</th>
        <td><!--#echo var="LAST_MODIFIED"--></td>
    </tr>
    <tr>
        <th>USER_NAME</th>
        <td><!--#echo var="USER_NAME"--></td>
    </tr>
</table>
</body>
</html>
```

　version 4 はともかく、Mac の `~/Sites/WebServer/Documents/` 以下に FileMaker Pro のレイアウト用のファイルを置くことで FileMaker Pro のレイアウト作成からほぼ解放されます。
 FileMaker のフィールドは、必要なフィールドを不可視領域に置いておけばいいだけとなります。

 　また、`~/Sites/WebServer/Documents/` 以下では、HTML/CSS、JavaScript は置けますし、
  PHP や CGI も動作しますから、その延長として、PostgreSQL、MySQL、SQLite3 も操作できるということになります。この辺りはアイディア次第ということでしょうか。

 レイアウト作成ができるようになりましたが、差し当たって２つの問題が未解決です。
 - FileMaker Pro と localhost 側のデータのやり取り
 - localhost 側のページ遷移の FileMaker Pro への反映

　以上、２つを順番に解決していきます。