.htaccessを便利に扱う為の、個人的にそれなりに良く使う設定まとめ

2019年11月28日

フレームワークとか使う時に「一緒に設置してね♪」とかなっているパターンの多い.htaccessファイル。

mod_rewrite周りなんかは書き方が覚えられなかったりする事も多く、その場合は都度調べるとかでも良いのですが、そういえばそれ以外にもちょこちょこと使う割には毎回調べて記述するといった不毛な時間を過ごすことが多いという事実に気づき、だったらある程度書き方をまとめておこう、と、そう思った次第です。

よく使う設定というのは人によっても違うと思いますが、まあそれなりに共通する方もいらっしゃるのではないかと思いますので、つらつらと書き留めておこうと思います。

それにしても最近野菜が高いですね。

PHPのWarningとErrorを表示する

開発中は表示させたい!

そんな夜もありませんか?

php_flag display_errors On
php_value error_reporting 6135

逆にPHPの警告やエラー関連の表示を切りたい

逆にリリース時は逆に切っておきたいですね。逆に。

php_flag display_errors Off

CGIを有効にしたい

デフォルトでCGI動かない場合に。

また、cgi-bin以下でしか動かないサーバでもこの記述でどこでも動くようになるかもしれません。

Options FollowSymLinks ExecCGI
AddType application/x-httpd-cgi .cgi

ファイル名省略のアクセス時、index.htmlより先にindex.phpとかindex.cgiが呼び出されて欲しい

極端な例ですが、サイトリニューアル時にトップページがindex.php等のプログラムに動作させることになったので、index.htmlには”/”(ルート)にリダイレクトさせるようなコードを書いておいた際に、DirectoryIndexの設定をきちんとしていないと無限ループに・・・・・

DirectoryIndex index.php index.cgi index.html index.htm

SSIが動くサーバで、拡張子htmlでもSSIが動作させられるようにしたい

なんか昔にメモしていたが、もしかすると1回も使ったことないかも・・・

AddType text/x-server-parsed-html .shtml .html

お問い合わせフォーム等、特定ディレクトリだけSSLにリダイレクトしたい。それ以外は非SSLで接続させたい

HTMLファイル側のグローバルメニューをhttpとかhttpsから始まるフルパスで書くのは、テスト環境などの事も考慮するとメンテナンス性が落ちるので避けたい所。

そんな時はmod_rewriteで解決。

RewriteEngine On
# contactはSSL
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^contact/(.*)?$ https://%{HTTP_HOST}/contact/$1 [L,R]
# contact以外は非SSL
RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{REQUEST_URI} !contact/ [NC]
RewriteRule ^(.*)?$ http://%{HTTP_HOST}/$1 [L,R]

URL上は静的なhtmlと見せかけて、実は裏ではプログラムを動作させたい

まあその、これもmod_rewriteのサンプルです。

/products/1.html とかにアクセスしたら、商品マスターからid=1のデータを引っ張ってきて表示する的なやつですね。

値を2つ取りたい場合は、$1,$2 となります。

RewriteEngine On
RewriteRule ^products/([0-9]+)\.html$ products/index.php?id=$1 [L]
RewriteRule ^place/([0-9]+)/([0-9]+)/$ place/index.php?id=$1&area=$2 [L]

引っ越しました!で、リダイレクト

なんというかその、引っ越しました!で、リダイレクトです。タイトルまんまですね。

ちゃんと引っ越した事を分かる様にリダイレクト設定しておかないと、検索エンジンが引っ越しを正確に認識出来なかったりします。

# hoge以下は独立したサイトになりました!とかの例
Redirect permanent /hoge/ http://hoge.example.com/

# 全体のお引っ越しの場合
Redirect permanent / http://www.example.com/

IPアドレスで制限をかけたい場合

# 192.168.0. 以下のみ許可
order deny,allow
deny from all
allow from 192.168.0.

# .hoge.ne.jpからと111.111.111.111からのアクセスを拒否
order allow,deny
allow from all
deny from .hoge.ne.jp
deny 111.111.111.111

ファイル名省略アクセス(ディレクトリ名でアクセス)された場合にディレクトリの内容を見せないようにする

たまーにデフォルトでファイルが見えちゃうサーバが。

用途にもよりますが基本的には見せないようにしましょう。

Options -Indexes

特定の拡張子についてはアクセスを許可しない場合

ちょっとした設定ファイルを置かなければいけない時など、大体URLがばれることはあまり無いでしょうが念の為設定したい所。

# 以下の拡張子はアクセスを許可しない
<Files ~ "^\.(htaccess|htpasswd|dat|csv|txt|inc)$">
  deny from all
</Files>

BASIC認証をかけたい

htpasswdファイル作成方法は、WEB上でもツールがあったりしますのでそちらが便利。

linux上とかでコマンドで生成したい場合は、

新規:htpasswd -c /var/www/htdocs/.htpasswd [ユーザー名]

追加・更新:htpasswd /var/www/htdocs/.htpasswd [ユーザー名]

(いずれもこの後にパスワードを2回入力)

とかすると生成出来ます。

-cオプションは、既にパスワードファイルがあっても上書きしてしまうので注意。

.htaccessの中身はこんな感じです。

# .htpasswdファイルが/var/www/htdocs/.htpasswdに配置されている場合
AuthUserFile /var/www/htdocs/.htpasswd
AuthGroupFile /dev/null
AuthName "Authentication area"
AuthType Basic
require valid-user