「Apache2」カテゴリーアーカイブ

ブログのURLを変更した場合のリダイレクト処理

ブログのアプリをblognplusからWordPressに変更した際にURLもhttps://hiro7216.mydns.jp/blognplusからhttps://hiro7216.mydns.jp/blogへと変更しました。
当然ながらGoogleやYahooなどの検索エンジンでは以前のURLが表示されますし、ブックマークなどでURL指定でお越しになられる方も以前のURLでのアクセスになります。
URLの変更はこちらの都合なので、以前のURLでアクセスしても可能な限り目的のページを表示できるようにしました。

今回はblognplus/index.php?e=xxxxをblog/?p=xxxxにするケースと
blognplus/xxxxをblog/xxxxにするケースの2種類だけの対応となります。

使用するのはApacheのRewriteEngineです。
サーバーが対応していない場合は使えませんので、その点だけは注意が必要です。
またApacheではなくnginxでもこの方法は使用できません。
nginxの場合は書き方を少し変えてnginx.confに記載する必要があります。

最初に結論から書きます。
設置してるwebのトップに.htaccessを置いて以下の内容を記述します。
(blognplusの部分は以前のURL、blogの部分は新しいURLとなります)

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{QUERY_STRING} e=(.+)
    RewriteRule ^blognplus/(.*)$ /blog/?p=%1 [R=301,L]
    RewriteRule ^blognplus/(.*)$ /blog/$1 [R=301,L]
</IfModule>

RewriteEngineを細かく説明すると色々と難しいので簡単な説明にします。

まず1行目の<IfModule mod_rewrite.c>ですが、これはRewriteEngineモジュールが使用できる場合という意味です。
RewriteEngineモジュールが使用不可の場合は今回の設定は全て無視されます。
2行目はRewriteEngineを使用する、です。

3行目と4行目は関連しています。
3行目はクエリ文字列(URLの?の後ろに付く文字列です)がe=xxxxになってた場合に変数に保存します。
(xxxxの部分は任意の文字列です)
4行目はURLがblognplus/~~~~だった場合に/blog/?p=%1にリダイレクトします。
%1の部分は3行目で保存していたxxxxの部分に置き換えられます。

5行目はblognplus/xxxxにアクセスがあった場合に/blog/xxxxにリダイレクトします。
($1がxxxxに置き換えられるだけです)

[R=301,L]の部分のR=301はリダイレクトなので、消して[L]だけにするとリダイレクトせずに昔のURLのまま、新しいURLの内容が表示されます。
Lの部分は条件に一致したらその次のルールは使わずに終了という意味です。

RewriteEngineを上手に使うとドメインを転送することもできますし、もっと細かくURLを変換することも可能です。
Webを扱う人は覚えておくと色々便利に使えます。

Apache2 Indexesの文字化け

Apache2をバージョンアップしてみたところIndexesでファイルの一覧を表示しているページが文字化けを起こしました。
内部CharsetはUTF-8でAddDefaultCharsetもUTF-8、apache2/conf.d/charsetもUTF-8
ついでにphp.iniのDefaultChasetもUTF-8でなぜ文字化けするのか理解不能でした。

調べてみると同じ症状になった方がいるようですね。
一応http://www.apache.org/dist/httpd/CHANGES_2.2.6に書かれていますがなんとも(笑)
※既にリンク先のサイトはなくなっているようです

*) mod_autoindex: Add in Type and Charset options to IndexOptions
directive. This allows the admin to explicitly set the
content-type and charset of the generated page and is therefore
a viable workaround for buggy browsers affected by CVE-2007-4465
(cve.mitre.org). [Jim Jagielski]

本来は/conf/extra/httpd-autoindex.confを書き換えるのですがDebian標準インストールでは
Apache2.confに書いてあるので直接弄っちゃいます!

Apache2.confの セクションの以下の行に Charset=UTF-8を足せばOKです。
※UTF-8の部分はご自分の環境のCharsetで書き換えてください。

変更前
IndexOptions FancyIndexing VersionSort HTMLTable NameWidth=*
変更後
IndexOptions FancyIndexing VersionSort HTMLTable NameWidth=* Charset=UTF-8
↑次の行ではなく一行で書きます

当然ながら変更したらApache2を再起動してください。
再起動後にIndexesなページを再表示したら文字化けが解消されてました!