質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

Q&A

解決済

2回答

2880閲覧

.htaccessでのリダイレクト設定について

ky_46

総合スコア92

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

0グッド

0クリップ

投稿2017/08/30 07:18

###前提・実現したいこと
http://hoge.com/
というサイトがあったと仮定します。

ここにphpというディレクトリを作成し、プログラムを使用してもらおうとします。

仮に、
homer.php
marge(ディレクトリ) → index.php
bart(ディレクトリ)
lisa.php

というファイル構造になっていたとします。
もちろん、http://hoge.com/php/ としても、このファイルの一覧が出ないようにはしました。

そして、http://hoge.com/php/marge/index.php がプログラムのスタート位置ですので~と配布したところ

http://hoge.com/php/ でスタートできるようにせよ」

と言われてしまいました。
※ロジカルな理由は出てきませんが、突き詰めると長いURLのが嫌なのだそうです。一応、ブックマークは提案しましたが、使いたがりません…

仕方なく、index.htmlを置いて、
<meta http-equiv="refresh"content="1; url=/marge/index.php">

で飛ばしていますが、今後のこともありますので、.htaccessでリダイレクトをかけたいと思います。

###該当のソースコード

RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /php/marge/index.php [L]

###試したこと
いろいろGoogleで調べまして、上記のような.htaccessを組み、一時的にindex.htmlを消して試したところ、http://hoge.com/php/index.html でなら、http://hoge.com/php/marge/index.php へ飛びました。
指定のファイルやディレクトリが存在しない場合は、/php/marge/index.phpへリダイレクトがかかるという構造になっているかと思います。
が、http://hoge.com/php/ だとエラー表示になってしまいます。

http://hoge.com/php/ のように、ディレクトリまで指定して、index.htmlを除外したURLをキックとして、RewriteRule で指定のディレクトリに飛ばすには、どのような記述をすればよいのでしょうか?

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

失礼しました。

/phpディレクトリが既にあるので、下記のようにRewriteCond %{REQUEST_FILENAME} !-d (条件:該当ディレクトリがなかったら)とは書けませんね。

将来的にどのようなリクエストURLを想定しているのかわかりませんが、今回に限って言えば条件は、下記のようにURL限定だけで良いかと思います。

apache

1RewriteEngine on 2RewriteCond %{REQUEST_URI} ^/php/(index\.html)?$ [NC] 3RewriteRule ^php/(index\.html)?$ /php/marge/index.php [NC,L]

下記のようにすれば、URLが間違っていたらhttp://hoge.com/php/にリダイレクトします。
リダイレクトは、301と302の2種類があって、下記はR=302を使用しています。

R=301:「URLが変わった」などの恒久的なURL転送
R=302:単純に「R」と書いても同じで、一時的なURL転送

apache

1RewriteEngine on 2RewriteCond %{REQUEST_URI} ^/php/(index\.html)?$ [NC] 3RewriteRule ^php/(index\.html)?$ /php/marge/index.php [NC,L] 4 5RewriteCond %{REQUEST_FILENAME} !-f 6RewriteCond %{REQUEST_FILENAME} !-d 7RewriteRule ^(.*)$ /php/ [R,NC,L]

細かいことを補足しておきますと、リクエストURLhttp://hoge.com/php/の末尾のスラッシュ(/)ですが、Apacheのリクエストは内部でDirectoryIndexの設定内容で展開されて、http://hoge.com/php/index.htmlまたは、http://hoge.com/php/index.phpとなります。

また、リライトが思い通りに動かない場合、Apacheの設定を変更できる場合は、下記のようにリライトログの設定してログの中身を参照するとわかりやすいです。

apache

1<VirtualHost *:80> 2 ... 3 RewriteLog logs/rewrite_log #リライトログパス 4 RewriteLogLevel debug 5</VirtualHost>

投稿2017/08/31 03:29

編集2017/08/31 03:34
Tomak

総合スコア1652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ky_46

2017/08/31 05:07

ご回答、ありがとうございました。 大変参考になりました。 今回の設置はレンタルサーバー上になりますので、apacheの設定が修正できないのが残念です。 致し方無いので、いろいろ.htaccessを修正して、トライアンドエラーで試してみたいと思います。 ご指導ありがとうございました。
guest

0

下記でいかがでしょうか?

NCは大文字小文字関係なくマッチさせます。
QSAはクエリストリング(?xxx=yyy)を含めてリライト処理します。
Lはマッチしたらここで終了します。

apache

1RewriteEngine On 2RewriteBase / 3RewriteCond %{REQUEST_FILENAME} !-f 4RewriteCond %{REQUEST_FILENAME} !-d 5RewriteCond %{REQUEST_URI} ^/php/(index\.html)? [NC] 6RewriteRule php/(index\.html)? /php/marge/index.php [NC,QSA,L]

投稿2017/08/30 08:07

Tomak

総合スコア1652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2017/08/30 13:07

リライト後の指定でクエリストリングを書いてないので、QSAオプションは不要ですね。
ky_46

2017/08/31 02:37

ご回答ありがとうございます。 ただ…試したのですが、http://hoge.com/php/ で403エラーになるのは変わらず、http://hoge.com/php/index.html もエラーになってしまいます。 otnさん指摘のQSAオプションを除いても同じでした。 RewriteRuleの指定なのですが、いろいろGoogleでしたべたところ RewriteRule ^(.*)? /php/marge/index.html [NC,L] とすると、何でも右の場所へ飛ばすようですが、この正規表現だと「なんでも良い文字列が0以上」だと思うのですが、上記でも http://hoge.com/php/ は403になってしまいますが、「URLがディレクトリの名前までで終わっていて、ファイル名がない」という状態はこれでは指定できないのでしょうか? よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問