.htaccessで日本語を含むリダイレクト(さくらインターネット)

スポンサーリンク

使っているレンタルサーバ

パーマリンクに日本語が入ってしまうのをやめ、数字のパーマリンクにした際にリダイレクトしようとしたら転送されず困ったのでメモしておきます。

当初は何も考えずURLエンコードしたURLを記述しましたが転送できず、日本語で記述したところ、あっさり転送できました。

さくらインターネットでの事例ですが、サーバ情報は以下のようになっていたので似た環境であれば同じようになると思います。

  • OS:FreeBSD 9.1-RELEASE-p24 amd64
  • Webサーバ:Apache/2.4.46

日本語を含む場合はUTF-8で保存

日本語を記述する場合は保存時に文字コードを「UTF-8」で保存してください。

テキストエディタがサクラエディタの場合は右下あたりに文字コードが表示されており、「UTF-8」となっていればOKです。

SJISなどに鳴っている場合は以下のように「名前を付けて保存」から、

「文字コードセット」を「UTF-8」に切り替えてから保存します。

次回からは何も指定しなくてもUTF-8で扱われます。

転送元

転送元のNG例(転送元がURLエンコードされてる)

以下の例は「test/日本語/」をURLエンコードし「test/%E6%97%A5%E6%9C%AC%E8%AA%9E/」と記述しましたが無反応です。

<IfModule mod_rewrite.c>
   RewriteEngine on 
   RewriteBase /
   RewriteRule ^test/%E6%97%A5%E6%9C%AC%E8%AA%9E/$ "https://sakue.com/wordpress" [R=301,L]
</IfModule>

転送元の正しい例(日本語でそのまま書く)

以下のように日本語のURLもそのまま書くと正常に転送されました。

<IfModule mod_rewrite.c>
   RewriteEngine on 
   RewriteBase /
   RewriteRule ^test/日本語/$ "https://sakue.com/wordpress" [R=301,L]
</IfModule>

転送先

転送先のNG例(転送先がURLエンコードされてる)

以下の例では、転送先にURLエンコードしたものを指定していますが、リダイレクトされるものの全然関係ないページに転送され、404のエラーが出ました。

転送先に指定しているのは「https://sakue.com/wordpress/日本語」をURLエンコードしたものです。

<IfModule mod_rewrite.c>
   RewriteEngine on 
   RewriteBase /
   RewriteRule ^test/$ "https://sakue.com/wordpress/%E6%97%A5%E6%9C%AC%E8%AA%9E" [R=302,L]
</IfModule>

上記で転送後にブラウザのURL欄を確認すると以下のようになっていました。

https://sakue.com/wordpress/%25E67%25A5%25E6C%25AC%25E8%25AAE

一見、URLエンコードされた日本語みたいな感じになっていますが、デコードしてみても以下のような文字列になってしまい戻せません。

文字コードも色々変更して試してみましたが戻りませんでした。

https://sakue.com/wordpress/%E67%A5%E6C%AC%E8%AAE

転送先の正しい例

転送先も同様に日本語のまま記述すればOKです。

<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteBase /
   RewriteRule ^test/$ "https://sakue.com/wordpress/日本語" [R=302,L]
</IfModule>

要するに、転送元も転送先も日本語で書かないと正しく動作しないという事です。

パラメータに日本語をそのまま渡すという機会はそうないので混乱してしまいましたが、正常に転送されるようになりました。

その他

編集対象の.htaccessの場所

WordPressの「.htaccess」はWordPressのインストールディレクトリにあります。
「wp-content」や「wp-admin」ディレクトリと同じ階層です。

例えばさくらインターネットでwordpressをインストールすると以下のような階層にあると思います。

/home/sakue/www/wordpress/

パスにするとこんな感じです。

/home/sakue/www/wordpress/.htaccess

相対パス指定

上記の状態で以下のように「^test/日本語/$」という相対パス指定をすると、

RewriteRule ^test/日本語/$ "https://sakue.com/wordpress" [R=302,L]

以下のパスを示す事になります。

https://sakue.com/wordpress/test/日本語/

日本語を含むルールが転送されず、相対パス指定が間違ってるのかと思ったので一応メモしておきました。

複数記述

「RewriteRule」行を追加していけばOKです。

<IfModule mod_rewrite.c>
   RewriteEngine on 
   RewriteBase /
   RewriteRule ^2020/08/26/さくらインターネットのwordpress/$ "https://sakue.com/wordpress/archives/136" [R=301,L]
   RewriteRule ^2020/08/27/windows10の各種ファイルの保存先を変更/$ "https://sakue.com/wordpress/archives/155" [R=301,L]
   RewriteRule ^2020/08/27/wordpressのメールとさくらインターネット/$ "https://sakue.com/wordpress/archives/176" [R=301,L]
   RewriteRule ^2020/08/27/hdmiキャプチャデバイス対決/$ "https://sakue.com/wordpress/archives/182" [R=301,L]
</IfModule>

コメント

タイトルとURLをコピーしました