特定の URL のみ Basic 認証をかける・除外する (Apache 2.2)

Apache 2.2 を使用している Web サーバで、 .htaccess のみを使い特定の URL のみ Basic 認証を外す必要があり調べた。

特定の URL のみ Basic 認証をかける

## Allow と Require のいずれかの許可があればアクセス可能にする
Satisfy Any

## /members/ で始まる URL へのアクセスを禁止する
SetEnvIf REQUEST_URI "^/members/" restricted_url
Order allow,deny
Allow from all
Deny from env=restricted_url

## /members/ 以下でも Basic 認証を通過すればアクセスできる
AuthUserFile "/path/to/.htpasswd"
AuthGroupFile /dev/null
AuthName "Restricted Files"
AuthType Basic
require valid-user

ここで SetEnvIf に指定している "^/members/" の部分は正規表現で記述する。単に "/members/" と記述すると /sub/members/directory にもマッチするので注意。

特定の URL のみ Basic 認証を除外する

## Allow と Require のいずれかの許可があればアクセス可能にする
Satisfy Any

## /images/ で始まる URL へのアクセスを常に許可する
SetEnvIf REQUEST_URI "^/images/" allowed_url
Order deny,allow
Deny from all
Allow from env=allowed_url

## それ以外の URL は Basic 認証を通過すればアクセスできる
AuthUserFile "/path/to/.htpasswd"
AuthGroupFile /dev/null
AuthName "Restricted Files"
AuthType Basic
require valid-user

Homebrew で過去にインストールした MySQL の操作

MySQL のバージョン

% mysql --version
mysql  Ver 8.0.19 for osx10.14 on x86_64 (Homebrew)

サービス状態の確認

% mysql.server status

サービス停止

% brew services stop mysql

mysql.server コマンドでは停止できない

root パスワードのリセット

セーフモードでサービスを起動し、一旦パスワードを空にする

% mysqld_safe --skip-grant-tables &
% mysql -u root
 
> use mysql;
> update mysql.user
    set authentication_string = null
    where user = 'root'
    ;

通常モードでサービスを起動したあと、空のパスワードでログインし、パスワードを設定しなおす

% mysql.server restart

> alter user 'root'@'localhost' identified by 'パスワード';

パスワードポリシーの確認と設定

> show variables like '%validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

> set global validate_password.mixed_case_count = 0;
> set global validate_password.number_count = 0;
> set global validate_password.special_char_count = 0;

PuTTY (.ppk) → OpenSSH 形式への変換とパスフレーズの変更

PuTTY → OpenSSH 形式への変換

% puttygen -O private-openssh id_dsa.ppk -o id_dsa.pem
Enter passphrase to load key:

OpenSSH → PuTTY 形式への変換

% puttygen -O private id_dsa.pem -o id_dsa.ppk
Enter passphrase to load key:

OpenSSH: パスフレーズの変更

% ssh-keygen -f id_dsa.pem -p
Enter old passphrase:
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.

PuTTY: パスフレーズの変更

% puttygen -P id_dsa.ppk
Enter passphrase to load key:
Enter passphrase to save key:
Re-enter passphrase to verify:

さくらのレンタルサーバで初期ドメインへのアクセスを禁止する

さくらのレンタルサーバに複数のサイトを設置する場合、各バーチャルホストのファイルは www 以下に配置しないといけないため、初期ドメインからすべてのサイトのデータが閲覧できてしまう。

www/
    - host1/
        - html/ ... host1.example.com
    - host2/
        - html/ ... host2.example.com
    ...

それを防ぐには Rewrite Module を使って初期ドメインの場合のみ表示先を切り替えてやればよい。

# .htaccess
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?[^.]+\.sakura\.ne\.jp$ [NC]
RewriteRule .* index.php [L]
<?php
// ~/www/index.php
http_response_code(404);

スクロール可能な要素に動的に内容を追加した際に一番下までスクロールする

Element.scrollHeight を用いる。

const output = document.getElementById('output')

function addItem (item) {
    output.appendChild(item)
    output.scrollTo(0, output.scrollHeight)
}