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

さくらのレンタルサーバに複数のサイトを設置する場合、各バーチャルホストのファイルは 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);

psql の入出力エンコーディングを確認・設定する

Windows 上の PostgreSQLコマンドラインツール psql を使ってデータベースにデータを取り込もうとしたところ、次のようなエラーが出た。 入力の文字エンコーディングが合っていない。

example_db=> \i data.sql
psql:data.sql:41: ERROR:  invalid byte sequence for encoding "SJIS": 0x85 0x27

入出力エンコーディングを確認する

example_DB=> show client_encoding;
 client_encoding
-----------------
 SJIS
(1 row)

入出力エンコーディングを設定する

一時的に(クライアントを終了するまで)エンコーディングを変えるには \encoding 内部コマンドを用いる。

example_DB=> \encoding 'UTF8'
example_DB=> show client_encoding;
 client_encoding
-----------------
 UTF8
(1 row)

デフォルトの入出力エンコーディングを設定する

デフォルトの入出力エンコーディングUnix 系の OS なら環境変数 LC_TYPE に基づいて決定される。 それを変更するには環境変数 PGCLIENTENCODING を設定する。

PGCLIENTENCODING=UTF8

macOS に Homebrew で Apache をインストール

brew install httpd

macOS に標準で入っている Apache を止める

# サービスの停止
sudo launchctl stop /System/Library/LaunchDaemons/org.apache.httpd.plist
# 自動起動の停止
sudo launchctl stop /System/Library/LaunchDaemons/org.apache.httpd.plist

設定ファイル

/usr/local/etc/httpd/httpd.conf

起動・停止コマンド

# /usr/local/bin/apachectl
apachectl start
apachectl graceful
apachectl restart
apachectl stop

自動起動の設定

以下のコマンドでユーザログイン時に自動起動・停止

brew services start httpd
brew services stop httpd

Axios の使い方

Axios は XMLHttpRequest を Promise ベースで使えるようにしたライブラリ。Promise の polyfill を使えば IE 11 から動作する。

公式の README よりよく使う部分を抜粋。

GET リクエストの基本

基本形は次の通り。HEAD, OPTIONS, DELETE メソッドの場合も同様の引数をとる。

const response = await axios.get(url[, config])

GET パラメータは URL に含めるかわりに次のように指定することができる。

// axios.get('/user?id=12345') と等価
axios.get('/user', {
	params: { id: '12345' }
})

POST リクエストの基本

基本形は次の通り。PUT, PATCH メソッドの場合も同様の引数をとる。

const response = await axios.post(url[, data[, config]])

リクエストボディにプレーンなオブジェクトを渡すと application/json 形式で送信される(リクエストヘッダも出力される)。

const user = {
	id: '12345',
	name: 'John'
}
axios.post('/user/update', user) // => {"id":"12345","name":"John"}

データを application/x-www-form-urlencoded 形式で送信したい場合は URLSearchParams クラスのインスタンスを渡す。

const params = new URLSearchParams()
Object.keys(user).forEach((key) => {
	params.append(key, user[key])
})
axios.post('/user/update', params) // => id=12345&name=John

レスポンス

レスポンスボディは data プロパティに格納されている。

try {
	const response = await axios.get('/user?id=12345')
	console.log(response.data) // => { user: { id: 12345, name: 'John' } }
} catch (error) {
	console.error(error)
}

オプション

リクエストヘッダを指定する

axios.get('/checkout/list', {
	headers: { Authorization: `token ${token}` }
})