mod_rewriteを使ったリダイレクト

投稿者: Anonymous

【やりたいこと】

特定のURLへのアクセスを決まったファイルへリダイレクトする

例:

sunday.local/app/get/1へアクセスがあったとして

sunday.local/dispatch.phpへリダイレクトする。

dispatch.phpの中でapp/get/1を解析して内部の形式で呼び出す(ディスパッチ)ようにしたいのですがリダイレクトが想定した動作をしません。

【環境】

  • OS:Ubuntu14.04
  • Apache:2.4.7

【手順】

  1. VirtualHostの設定
    /etc/apache2/sites-available/sunday.local.confを作成

AllowOverride Allで.htaccessの利用を許可しています。

    <VirsualHost *:80>
    ServerName sunday.local
    ServerAdmin [email protected]
    DocumentRoot /home/oono/bear/public
    ErrorLog /var/log/apache2/virtual.host.error.log
    CustomLog /var/log/apache2/virtual.host.access.log combined
    LogLevel warn
    <Directory "/home/oono/bear/public">
        Require all granted
        AllowOverride All
    </Directory>

  1. VirtualHostの有効化

有効にするために以下のコマンドを実行

    $ sudo a2ensite sunday.local
    $ sudo service apache2 reload
  1. /etc/hostsに追記

以下を追記しました。

    127.0.1.1   sunday.local

/home/oono/bear/public/test.htmlを配置

ブラウザからhttp://sunday.local/test.htmlにアクセスして表示されることを確認

  1. mod_rewriteを有効化

Apacehのモジュールrewriteを有効にする

    $ sudo a2enmod rewrite
    $ sudo service apache2 restart
  1. .htaccessを作成

sunday.localのドキュメントルート「/home/oono/bear/public」に.htaccessを作成
http://weblabo.oscasierra.net/apache-rewrite-1/を参考に

    RewriteEngine on
    RewriteRule ^/$ http://www.google.co.jp [R=302,L]
  1. ブラウザからアクセス

まずはテストなので分かりやすく「sunday.local/」にアクセスしたら「www.google.co.jp」にリダイレクトされることを期待してるのですが、403 Forbiddenの画面になります。

何か設定が不足、間違っているのでしょうか?

解決

.htaccessによってrewriteを使用する場合、設置したパスからの相対パスが入力されます。

http://sunday.local   =>  ""
http://sunday.local/  =>  ""  【注:最初の / は含まれません。】
http://sunday.local/test.html  =>  "test.html"

そのため、RewriteRuleの正規表現 ^/$ にはマッチせず、想定した動作になりません。
引数なしの場合は ^$ を、引数ありの場合は ^(.*)$ のような記述となります。

たとえば、次のような.htaccessを試してみてください。

RewriteEngine on
RewriteRule ^$ http://www.google.co.jp/ [R=302,L]
RewriteRule ^(.*)$ http://www.google.co.jp/#q=$1 [R=302,L,NE]
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *