ScriptAlias

指定のURLを、CGIの実行ディレクトリにマッピングする場合は、ScriptAliasディレクティブを使う。

mod_alias - Apache HTTP サーバ バージョン 2.4
Fedora 31 : Apache httpd : CGI スクリプトを利用する : Server World

[bg1@localhost ~]$ su
パスワード:
[root@localhost bg1]# cd /etc/httpd/conf
[root@localhost conf]# vi httpd.conf

httpd.confを開くと、前回の<IfModule alias_module>の中に、

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

と既に書いてあるので、/cgi-bin/の下のCGIファイルにアクセスすると、/var/www/cgi-bin/の下の指定のCGIが実行される。

[root@localhost conf]# cd /var/www/cgi-bin/
[root@localhost cgi-bin]# ls
[root@localhost cgi-bin]# vi testcgi1.cgi
[root@localhost cgi-bin]# which perl
/usr/bin/perl
[root@localhost cgi-bin]# vi testcgi1.cgi

Perlでテスト用CGIを作ってみる。

#!/usr/bin/perl

# ヒアドキュメントでテスト用CGIを書く.
$text = <<END; # ENDの前まで格納する.
Content-Type: text/html

<html>
  <head>
    <title>
      TestCGI1
    </title>
  </head>
  <body>
    TestCGI1
  </body>
</html>
END

# $textの出力.
print $text; # $textを出力.

せっかくなので、ヒアドキュメントで作成。

[root@localhost cgi-bin]# ls -al
合計 12
drwxr-xr-x. 2 root root 4096  3月 18 12:13 .
drwxr-xr-x. 5 root root 4096  3月 16 13:07 ..
-rw-r--r--. 1 root root  304  3月 18 12:13 testcgi1.cgi
[root@localhost cgi-bin]# chmod 755 testcgi1.cgi
[root@localhost cgi-bin]# ls -al
合計 12
drwxr-xr-x. 2 root root 4096  3月 18 12:13 .
drwxr-xr-x. 5 root root 4096  3月 16 13:07 ..
-rwxr-xr-x. 1 root root  304  3月 18 12:13 testcgi1.cgi
[root@localhost cgi-bin]# apachectl start

chmodで実行権限を付与して、Apacheを起動すると、

テスト用CGIが実行された
テスト用CGIが実行された

テスト用CGIが実行された。

Alias

Aliasは、指定のURLを実際のファイルパスにマップするディレクティブ。

mod_alias - Apache HTTP サーバ バージョン 2.4

これまでも、"/htmltest"なら"/var/www/htmltest"にマップしていたけど、本来は、"/"なら"/var/www/html"の下なので、"/htmltest"なら"/var/www/html/htmltest"となるはずだが、Aliasによって、違う場所"/var/www/htmltest"にマップできるわけである。

さて、これまでDocumentRootの下でこういうことをしてきたけど、全く違う場所にマップできるかというと、それも可能。
ただし、ちょっとハマったので注意。

最初は、

Alias /htmltest /var/www/htmltest/
<Directory "/var/www/htmltest/">
    Order deny,allow
    Deny from all
    Allow from localhost
</Directory>

<Directory "/var/www/htmltest/sub_dir1">
    Order allow,deny
    Allow from all
    Deny from localhost
</Directory>

Alias /www2 /var/www2/html
<Directory "/var/www2/html">
    Order allow,deny
    Allow from all
</Directory>

/varの下にwww2というディレクトリを作り、これまでのAliasと同様にこのように定義した。
ところが、これだと403のForbeddenになってしまう。
ディレクトリやindex.htmlのパーミッション、オーナー、グループなど確認したが、どうしても解決できない。

次に、

Alias /home /home/bg1/www
<Directory "/home/bg1/www">
    Require all granted
</Directory>

ホームディレクトリを公開する方法があったので、これも試したが同様に403のForbedden。

Alias で別 DocumentRoot を作り CGI, SSI, html を動かす

ただ、どうもApache2.4では、Allow、Denyを使う方法ではなく、Requireを使う方法じゃないと、ダメだというのはわかった。

Apache - apacheでDocumentRoot以外のアクセス方法について|teratail

結論として、/usr/localの下にディレクトリを作り、そこへのAliasとRequire all grantedを<IfModule alias_module>タグの中で定義すると、うまくいった。

[root@localhost conf]# cd /usr/local/www/
[root@localhost www]# ls
index.html
[root@localhost www]# ls -al
合計 12
drwxrwxr-x.  2 apache apache 4096  3月 17 16:41 .
drwxr-xr-x. 13 root   root   4096  3月 17 16:39 ..
-rwxrwxr-x.  1 apache apache   96  3月 17 16:41 index.html
[root@localhost www]# cd ..
[root@localhost local]# ls
bin  etc  games  include  lib  lib64  libexec  sbin  share  src  www
[root@localhost local]# ls -al
合計 52
drwxr-xr-x. 13 root   root   4096  3月 17 16:39 .
drwxr-xr-x. 12 root   root   4096 10月 24 08:12 ..
drwxr-xr-x.  2 root   root   4096  7月 25  2019 bin
drwxr-xr-x.  2 root   root   4096  7月 25  2019 etc
drwxr-xr-x.  2 root   root   4096  7月 25  2019 games
drwxr-xr-x.  2 root   root   4096  7月 25  2019 include
drwxr-xr-x.  2 root   root   4096  7月 25  2019 lib
drwxr-xr-x.  2 root   root   4096  7月 25  2019 lib64
drwxr-xr-x.  2 root   root   4096  7月 25  2019 libexec
drwxr-xr-x.  2 root   root   4096  7月 25  2019 sbin
drwxr-xr-x.  5 root   root   4096 10月 24 08:12 share
drwxr-xr-x.  2 root   root   4096  7月 25  2019 src
drwxrwxr-x.  2 apache apache 4096  3月 17 16:41 www
[root@localhost local]#

一応、apacheオーナーとグループにしたほうがいいらしいのでそうしてる。
パーミッションも775だけど、これもどこまで締めたり開けたりするかはわからない。
とにかく/usr/localにwwwフォルダを置いて、index.htmlは、

<html>
  <head>
    <title>UserLocal</title>
  </head>
  <body>
    UserLocal
  </body>
</html>

UserLocal。
httpd.confは、

<IfModule alias_module>
    #
    # Redirect: Allows you to tell clients about documents that used to
    # exist in your server's namespace, but do not anymore. The client
    # will make a new request for the document at its new location.
    # Example:
    # Redirect permanent /foo http://www.example.com/bar

    #
    # Alias: Maps web paths into filesystem paths and is used to
    # access content that does not live under the DocumentRoot.
    # Example:
    # Alias /webpath /full/filesystem/path
    #
    # If you include a trailing / on /webpath then the server will
    # require it to be present in the URL.  You will also likely
    # need to provide a <Directory> section to allow access to
    # the filesystem path.

    Alias /local "/usr/local/www"
    <Directory "/usr/local/www">
        Require all granted
    </Directory>

    #
    # ScriptAlias: This controls which directories contain server scripts.
    # ScriptAliases are essentially the same as Aliases, except that
    # documents in the target directory are treated as applications and
    # run by the server when requested rather than as documents sent to the
    # client.  The same rules about trailing "/" apply to ScriptAlias
    # directives as to Alias.
    #
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

</IfModule>

これまでIfModuleの中で定義してなかったけど、さらっとここに書けと書いてあったので。
外に書いた場合に上手くいくかはわかない。
これで、

アクセス出来た
アクセス出来た

/localで/usr/local/wwwの下にアクセス出来た。

<Directory>

<Directory>は、指定のディレクトリとそのサブディレクトリにのみ、中のディレクティブを適用できるように囲むためのディレクティブ。

core - Apache HTTP サーバ バージョン 2.4

[root@localhost ~]# cd /etc/httpd/conf
[root@localhost conf]# ls
httpd.conf  magic
[root@localhost conf]# vi httpd.conf
[root@localhost conf]# cd /var/www/htmltest/
[root@localhost htmltest]# ls
index.html
[root@localhost htmltest]# mkdir sub_dir1
[root@localhost htmltest]# cd sub_dir1/
[root@localhost sub_dir1]# ls
[root@localhost sub_dir1]# pwd
/var/www/htmltest/sub_dir1
[root@localhost sub_dir1]# cp ../index.html .
[root@localhost sub_dir1]# vi index.html
[root@localhost sub_dir1]# cat index.html
<html>
  <head>
    <title>Sub Directory 1</title>
  </head>
  <body>
    Sub Directory 1
  </body>
</html>
[root@localhost sub_dir1]#

htmltestディレクトリの下にsub_dir1ディレクトリとindex.htmlを作る。

Alias /htmltest /var/www/htmltest/
<Directory "/var/www/htmltest/">
    Order allow,deny
    Allow from all
</Directory>

<Directory "/var/www/htmltest/sub_dir1">
    Order allow,deny
    Allow from all
    Deny from localhost
</Directory>

基本的に、親ディレクトリのアクセスルールは、子にも継承される。
しかし、子で指定したルールが親を打ち消す場合がある。
ここでは、親はすべて可に対し、子はlocalhostを拒否。

親はIPでOK
親はIPでOK

親はIPでOK。

localhostもOK
localhostもOK

localhostもOK。

sub_dir1もIPならOK
sub_dir1もIPならOK

sub_dir1もIPならOK。

でもlocalhostはNG
でもlocalhostはNG

でもlocalhostはNG。

さて、親と子で排他だとどうだろう。

Alias /htmltest /var/www/htmltest/
<Directory "/var/www/htmltest/">
    Order deny,allow
    Deny from all
    Allow from localhost
</Directory>

<Directory "/var/www/htmltest/sub_dir1">
    Order allow,deny
    Allow from all
    Deny from localhost
</Directory>

親はlocalhostだけを許可、子はlocalhostだけを拒否。
親のIP拒否が継承されるなら、子のIP許可は起きない気もするが、

親IP拒否
親IP拒否

親IP拒否。

親localhost許可
localhost許可

localhost許可。

子IP許可
子IP許可

子IP許可。

親localhost拒否
localhost拒否

localhost拒否。

ということで、実際には継承されずそれぞれのディレクトリが独立してアクセス制御してる。

Order

Orderは、AllowとDenyの評価する順番を制御するディレクティブ。

mod_access_compat - Apache HTTP サーバ バージョン 2.4

前回は、localhostだけアクセス不可だったが、今回は、順番と許可拒否を変更し、localhostだけアクセス可能にしてみる。

Alias /htmltest /var/www/htmltest/
<Directory "/var/www/htmltest/">
    Order deny,allow
    Deny from all
    Allow from localhost
</Directory>

Order allow,denyをOrder deny,allowにすることで、Denyから決めていく。
Deny from allで全体を拒否、Allow from localhostlocalhostのみ許可とする。

IP指定だと拒否
IP指定だと拒否

IP指定だと拒否。

localhostは許可
localhostは許可

localhostは許可。

Deny

Denyは、指定のホスト名、IPアドレスIPアドレスの範囲のサーバからのアクセスを拒否することを表すディレクティブ。

mod_access_compat - Apache HTTP サーバ バージョン 2.4

最初に、Allowですべてのアクセスを許可してから、localhostのアクセスだけは拒否するようにしてみる。

[root@localhost ~]# cd /etc/httpd/conf
[root@localhost conf]# ls
httpd.conf  magic
[root@localhost conf]# vi httpd.conf
[root@localhost conf]# apachectl restart
[root@localhost conf]# vi httpd.conf

httpd.confを開いて、

Alias /htmltest /var/www/htmltest/
<Directory "/var/www/htmltest/">
    Order allow,deny
    Allow from all
    Deny from localhost
</Directory>

Deny from localhost、を後ろに追加する。
また、前に、Order allow,denyを追加した。
Orderは、

mod_access_compat - Apache HTTP サーバ バージョン 2.4

大きい範囲に許可してから小さい範囲に拒否、または大きい範囲に拒否してから小さい範囲に許可していくような順番を決めるために使う。
今回は、前者の場合なので、allow,denyである。
これが無いと、Deny from localhostでも、localhostでアクセス出来てしまったので、必ず付ける。

IPでアクセスできるが
IPでアクセスできるが

IPでアクセスできるが、

localhostだとForbidden
localhostだとForbidden

localhostだとForbidden。

Allow

Allowは、指定のホスト名、IPアドレスIPアドレスの範囲のサーバからのアクセスを許可することを表すディレクティブ。

mod_access_compat - Apache HTTP サーバ バージョン 2.4
第9回 知っておきたいApacheの基礎知識 その5:UNIX的なアレ:gihyo.jp出張所|gihyo.jp … 技術評論社

デフォルトで、"/var/www/html"にアクセスできるが、今回は"/var/www/htmltest/"の下にindex.htmlを置いて、そこにアクセスできるかを試す。

[bg1@localhost ~]$ su
パスワード:
[root@localhost bg1]# cd /etc/httpd/conf
[root@localhost conf]# ls
httpd.conf  magic
[root@localhost conf]# vi httpd.conf

httpd.confを開いて、

# Further relax access to the default document root:
<Directory "/var/www/html">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    #Options Indexes FollowSymLinks
    Options FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    #AllowOverride None
    AllowOverride All
    #
    # Controls who can get stuff from this server.
    #
    Require all granted
</Directory>

Alias /htmltest /var/www/htmltest/
<Directory "/var/www/htmltest/">
    Allow from all
</Directory>

<Directory>ディレクティブの後に、

mod_alias - Apache HTTP サーバ バージョン 2.4

Aliasディレクティブで"/htmltest"を"/var/www/htmltest/"に置き換えるようにする。
そして、<Directory>ディレクティブで、"/var/www/htmltest/"のアクセス制御を書いていく。
Allow from allだから、すべてのアクセスを許可。

[root@localhost conf]# cd /var/www/html/
[root@localhost html]# ls
index.html
[root@localhost html]# cd ..
[root@localhost www]# ls
cgi-bin  html
[root@localhost www]# mkdir htmltest
[root@localhost www]# cd htmltest/
[root@localhost htmltest]# cp ../html/index.html .
[root@localhost htmltest]# ls
index.html
[root@localhost htmltest]# vi index.html

htmltestフォルダを作って、index.htmlを開いて、

<html>
  <head>
    <title>HtmlTest</title>
  </head>
  <body>
    HtmlTest
  </body>
</html>

とする。
あとは、

[root@localhost conf]# ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        inet6 fe80::550b:2cd:4bf8:bef9  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:19:ca:92  txqueuelen 1000  (Ethernet)
        RX packets 4093  bytes 2695063 (2.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3522  bytes 493888 (482.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 28  bytes 2945 (2.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 28  bytes 2945 (2.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost conf]# 

IPは、10.0.2.15。
で、

[root@localhost conf]# apachectl start

Apacheを起動し、10.0.2.15/htmltest/index.htmlにアクセス。

HtmlTestが表示された
HtmlTestが表示された

HtmlTestが表示された。
すべてかどうかはチェックしてないけど、だいたい全てでしょ。

apachectl

Apacheをインストールし、設定し、起動する。

Fedora 31 : Apache httpd : インストール : Server World

Apacheのインストールは、

[bg1@localhost ~]$ su
パスワード:
[root@localhost bg1]# yum install httpd
メタデータの期限切れの最終確認: 0:02:12 時間前の 2020年03月15日 16時34分35秒 に実施しました。
パッケージ httpd-2.4.41-5.fc31.x86_64 は既にインストールされています。
依存関係が解決しました。
行うべきことはありません。
完了しました!
[root@localhost bg1]#

既にインストール済み。
設定は、

[root@localhost bg1]# cd /etc/httpd
[root@localhost httpd]# ls
conf  conf.d  conf.modules.d  logs  modules  run  state
[root@localhost httpd]# cd conf
[root@localhost conf]# ls
httpd.conf  magic
[root@localhost conf]# vi httpd.conf

"/etc/httpd/conf/"の下の"httpd.conf"を開く。

今の段階ではドメイン付けてないので、そのままでいいのでは。
今の段階ではドメイン付けてないので、そのままでいいのでは。

今の段階ではドメイン付けてないので、そのままでいいのでは。

これもドメインないのでコメントで。
これもドメインないのでコメントで。

これもドメインないのでコメントで。

一応Indexesを削除
一応Indexesを削除

一応Indexesを削除。

NoneじゃなくてAllに
NoneじゃなくてAllに

NoneじゃなくてAllに。

今のところは、index.htmlだけ。
今のところは、index.htmlだけ。

今のところは、index.htmlだけ。

一応末尾にServerTokens追加
一応末尾にServerTokens追加

一応末尾にServerTokens追加。

KeepAlive Onも追加
KeepAlive Onも追加

KeepAlive Onも追加。

[root@localhost conf]# ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        inet6 fe80::550b:2cd:4bf8:bef9  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:19:ca:92  txqueuelen 1000  (Ethernet)
        RX packets 12470  bytes 11958147 (11.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7960  bytes 917719 (896.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 50  bytes 4612 (4.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 50  bytes 4612 (4.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost conf]#

IPは、10.0.2.15。

[root@localhost conf]# cd ..
[root@localhost httpd]# ls
conf  conf.d  conf.modules.d  logs  modules  run  state
[root@localhost httpd]# cd conf.d/
[root@localhost conf.d]# ls
README  autoindex.conf  mod_dnssd.conf  userdir.conf  welcome.conf
[root@localhost conf.d]# mv welcome.conf welcome.conf.org

ウェルカムページを含めたウェルカム設定はリネーム。

[root@localhost conf.d]# cd /var/www/html/
[root@localhost html]# vi index.html

index.htmlは、

<html>
  <head>
    <title>Test</title>
  </head>
  <body>
    Test
  </body>
</html>

簡単なものを置いておく。
今では、一般的にsystemctlを使うが、

[root@localhost html]# which apachectl
/usr/sbin/apachectl
[root@localhost html]# apachectl start

今回は、あえてapachectlで起動する。

さっきのIPでindex.htmlにアクセスできた
さっきのIPでindex.htmlにアクセスできた

さっきのIPでindex.htmlにアクセスできた。