前回までで、CORESERVERでDjangoをCGIとして動かし、
https://django.tomomori.net/cgi-bin/django.cgi
でロケットが表示されました!
…しかし、
URLに cgi-bin/django.cgi があるのはカッコ悪いですね。
この記事では、
/cgi-bin/django.cgiをURLから消す方法- /にアクセスすると403が出る理由
- 最終的な完成形
.htaccess
を解説します。
public_htmlに.htaccessを作成する
~/domains/django.tomomori.net/public_html に.htaccessファイルを作成して下記のように編集して保存します。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /cgi-bin/django.cgi/$1 [L]
上記で、実在するファイル/ディレクトリ以外は全部、/cgi-bin/django.cgi/に渡そうとしました。しかし、
https://django.tomomori.net/admin/ は問題なく表示されますが、
https://django.tomomori.net/ では403エラーになってしまいました。
なぜ / が403になるのか?
https://django.tomomori.net/ にアクセスすると、Apacheは下記のように動きます。
- ドキュメントルートを見る
index.htmlなどを探す- 無い場合はディレクトリ一覧表示
- でも一覧は禁止 → 403
つまり、Djangoが呼ばれていないのが原因です。
/admin/ が表示できるのに / が403になるのは、
ルートだけDjangoに渡せていない
ためです。
解決策:.htaccessで内部リライトする
.htaccess を下記のように編集します。
RewriteEngine On
# ルートは明示的に Django へ(403回避)
RewriteRule ^$ /cgi-bin/django.cgi [L]
# static はApache側で配信するなら除外
RewriteRule ^static/ - [L]
# 実ファイル/実ディレクトリはそのまま
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# それ以外は Django へ(PATH_INFOとして渡す)
RewriteRule ^(.*)$ /cgi-bin/django.cgi/$1 [L]
これで問題は解決しました。
各設定の意味
RewriteEngine On
mod_rewrite を有効化。
RewriteRule ^$ /cgi-bin/django.cgi [L]
^$ は「空パス」= /。
これが無いと、ルートはApacheが処理してしまい403になります。
RewriteRule ^static/ – [L]
/static/ はDjangoに渡さず、Apacheがそのまま配信。
これをしないと:
- 管理画面CSSが崩れる
- 静的ファイルが遅くなる
などの問題が起きます。
今回のように !-f !-d を使っている場合、staticは自動的に除外されるため、必須ではありません。ただし、将来的な設定変更や構成変更に備えて明示的に除外しておくのが安全です。
実在ファイル・ディレクトリの除外
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
これは保険です。
- robots.txt
- favicon.ico
- 実在ディレクトリ
などをDjangoに渡さないようにします。
最終ルール
RewriteRule ^(.*)$ /cgi-bin/django.cgi/$1 [L]
それ以外のURLはすべてDjangoへ。
例:
/admin//accounts/login//myapp/page/
すべてきれいなURLで動きます。
これでどうなる?
Before:
https://django.tomomori.net/cgi-bin/django.cgi/admin/
After:
https://django.tomomori.net/admin/
そして、
https://django.tomomori.net/
もDjangoサイトが正常に表示されます。
まとめ
CORESERVER + Django CGI の場合、
- ロケット表示成功
- .htaccessで内部リライト
- staticは除外
- ルートを明示的にDjangoへ渡す
これが最も安定構成です。
ここまでできれば…
CORESERVER V2上で、
- Django 6
- pyenv
- venv
- MySQL
- 管理画面
- きれいなURL
すべて完成です。
あとは、開発したDjangoアプリをデプロイすればいいですね。
この記事が、どなたかのお役に立てば幸いです。


コメント