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

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

新規登録して質問してみよう
ただいま回答率
85.54%
URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

.htaccess

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

Q&A

解決済

1回答

4956閲覧

301リダイレクトによるURL正規化: 拡張子なしに一本化する方法

ubegawa

総合スコア11

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

.htaccess

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

1グッド

1クリップ

投稿2019/07/14 01:16

URLの正規化について質問です。これまで.htmlや.phpという拡張子のついたURLを使っていたのですが、拡張子なしに変更するために.htaccessに以下の記述を加えました。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1.html

無事に拡張子なしでもアクセスできるようになったのですが、拡張子ありでも同様にアクセス可能で、同一ページに2つのURLが存在してしまっている状況です。これを拡張子なしに一本化する.htaccessの記述を、どなたか教えて頂けないでしょうか?

xekdwpsg👍を押しています

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

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

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

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

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

guest

回答1

1

ベストアンサー

以前同様の質問があり、そのとき試したら、リライトのループになりました。
ふと、マニュアルを見ていると、使えそうな変数(THE_REQUEST)があったので、やってみると出来ているみたいです。

Apache

1RewriteEngine on 2RewriteCond %{REQUEST_FILENAME} !-d 3RewriteCond %{REQUEST_FILENAME}.php -f 4RewriteRule ^(.*)$ $1.php [L] 5RewriteCond %{REQUEST_FILENAME} !-d 6RewriteCond %{REQUEST_FILENAME}.html -f 7RewriteRule ^(.*)$ $1.html [L] 8RewriteCond %{THE_REQUEST} .(php|html)\ HTTP 9RewriteRule ^(.*).(php|html)$ $1 [R=301,L]

投稿2019/07/14 03:39

otn

総合スコア84217

xekdwpsg👍を押しています

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

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

ubegawa

2019/07/14 21:15

ありがとうございます。頂いたコードで試しましたが、ループになってしまいました。状況をもう少し詳しく書かせて頂きます。何かご助言頂けることがあればよろしくお願いします。 頂いたコードでテスト: ループしてしまいました。 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php [L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^(.*)$ $1.html [L] RewriteCond %{THE_REQUEST} .(php|html)\ HTTP RewriteRule ^(.*).(php|html)$ $1 [R=301,L] いくつか同じ内容・似た内容のページをチェックしましたが、これらのページのコードでもうまく動きません。ループになるか404になります。サーバーはXサーバーです。 https://teratail.com/questions/135311 https://teratail.com/questions/88798 現在は、以下の内容に戻しています。htmlありとなしが存在していますが、wwwなし、httpsへのリダイレクト、index.htmlをなくすという一般的な正規化はできています。 RewriteEngine on RewriteCond %{HTTP_HOST} ^www.ultrabem-hobby.com$ RewriteRule ^(.*) http://ultrabem-hobby.com/$1 [R=301,L] RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php [L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^(.*)$ $1.html [L] RewriteCond %{THE_REQUEST} .(php|html)\ HTTP RewriteRule ^(.*).(php|html)$ $1 [R=301,L] RewriteCond %{THE_REQUEST} ^.*/index.html RewriteRule ^(.*)index.html$ http://ultrabem-hobby.com/$1 [R=301,L] AddHandler fcgid-script .html
otn

2019/07/15 11:45 編集

おかしそうな場所は無さそうです。 リライトログを確認するくらいでしょうか。
ubegawa

2019/07/15 10:46

ありがとうございます。リダイレクト先をよく見てみたら、ループではなくリダイレクト先の基点の問題でした。教えて頂いたTHE_REQUESTで解決しました。 RewriteCond %{THE_REQUEST} .(php|html)\ HTTP RewriteRule ^(.*).(php|html)$ http://ultrabem-hobby.com/$1 [R=301,L] ありがとうございました!
otn

2019/07/15 11:47

よかったです。 RewriteCond %{THE_REQUEST} ^.*/index.html の行は不要でしょうね。RewriteRule行でindex.htmlの存在をチェックしているので。
ubegawa

2019/07/15 12:21

確かに、削除しても無事に動きました。これで解決済みとさせて頂きます。重ね重ねありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.54%

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

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

質問する

同じタグがついた質問を見る

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

.htaccess

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