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

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

ただいまの
回答率

89.10%

.htaccessを修正することで403を回避し、200でdir.htmlを返す方法を教えて欲しい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 305

noboru2019

score 5

生半可な質問で、皆さんにお手数をおかけてしており、誠に申し訳ございません。
dameoさんが、いろいろ応対してくださり、私の拙い質問を整理してくださいました。
ありがたいことです。ここに、整理していただいた質問を掲載し直させていただきます。
何卒よろしくお願いします。

・ー・ー<質問ここから>ー・ー・ー・ー・

■実現したいこと
サーバー上には
(DocumentRoot)/dir/
(DocumentRoot)/dir.html
はあるが、
(DocumentRoot)/dir/index.html
はない(例外的にあるディレクトリもある)

http://domain/dir
http://domain/dir/
というリクエストを受けたとき、レスポンスで
(DocumentRoot)/dir.html
を返したい
※dir/とdir.htmlの組は数千単位で存在し、他にもディレクトリやファイルは存在する
※dir/index.*については後で考慮するので、当面無視する
※ただし/と/index.htmlへのリクエストについては、.htaccessで変更してはならない

■サブドメイン以下のディレクトリーとファイルがあります。

Subdomain/aaa/
Subdomain/bbb/
Subdomain/ccc/
Subdomain/wp/
Subdomain/aaa.html
Subdomain/bbb.html
Subdomain/ccc.html
Subdomain/index.html
Subdomain/index.php
Subdomain/sitemap.xml

Subdomain/bbb/ddd/
Subdomain/bbb/ddd.html

Subdomain/ccc/eee/fff/
Subdomain/ccc/eee/fff.html

※ sitemap.xmlは、PRO-Sitemapsで出力されたファイルです。

■実現手段
以下の.htaccessを用意し、(DocumentRoot)に設置した。

ーー<.htaccess全文>ーーーーー
DefaultType text/html 
DirectoryIndex index.php index.html

RewriteEngine On
RewriteBase /

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

# BEGIN WordPress
# BEGIN WordPress から END WordPress までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
ーーーーー

■問題
以下のURLに対して、403が発生して困っている。
http://domain/dir -> 301でhttp://domain/dir/(↓)にリダイレクト
http://domain/dir/ -> 403

■1.試したこと
(1).htaccessに以下を追記した。

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

ーー<.htaccess全文>ーーーーー
DefaultType text/html 
DirectoryIndex index.php index.html

RewriteEngine On
RewriteBase /

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

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

# BEGIN WordPress
# BEGIN WordPress から END WordPress までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
ーーーーー

→403が404になるだけだった。

■質問
.htaccessを修正することで403を回避し、200でdir.htmlを返す方法を教えて欲しい

■2.試したこと
(1).htaccessに以下を追記した。

RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule .* %{REQUEST_URI}.html [L]
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_FILENAME}../$1.html -f
RewriteRule (.*)/$ $1.html [L]

ーー<.htaccess全文>ーーーーー

DefaultType text/html 
DirectoryIndex index.php index.html

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule .* %{REQUEST_URI}.html [L]
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_FILENAME}../$1.html -f
RewriteRule (.*)/$ $1.html [L]

# BEGIN WordPress
# BEGIN WordPress から END WordPress までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
ーーーーー

・http://subdomain.domain.info/
→ OK(併存しているWPのindex.phpが表示される)
・http://subdomain.domain.info.index.html
→ OK(静的HTMLが表示され、ページ内リンクOK)

・http://subdomain.domain.info/aaa/
→ 表示が崩れ、ページの内同じディレクトリのリンクが404となる
(手入力 http://subdomain.domain.info/bbb/ddd.html → OK)

・http://subdomain.domain.info/aaa/1234
→ OK
(手入力 http://subdomain.domain.info/bbb/1234.html → OK)

・http://subdomain.domain.info/bbb/ddd/
→ 403
(手入力 http://subdomain.domain.info/bbb/ddd.html → OK)

・http://subdomain.domain.info/ccc/eee/fff/
→ 403
(手入力 http://subdomain.domain.info/ccc/eee/fff.html → OK)

■質問
.htaccessを修正することで403を回避し、200でdir.htmlを返す方法を教えて欲しい

■3.試したこと
(1).htaccessに以下を追記した。

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (.*)/$ $1.html [L]

ーー<.htaccess全文>ーーーーー

DefaultType text/html 
DirectoryIndex index.php index.html

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule .* %{REQUEST_URI}.html [L]
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_FILENAME}../$1.html -f
RewriteRule (.*)/$ $1.html [L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (.*)/$ $1.html [L]

# BEGIN WordPress
# BEGIN WordPress から END WordPress までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
ーーーーー

→ 結果、403、404は返されなくなった。しかし、表示が崩れ、ページの内同じディレクトリのリンクが404となる

・http://subdomain.domain.info/
→ OK(併存しているWPのindex.phpが表示される)

・http://subdomain.domain.info.index.html
→ OK(静的HTMLが表示され、ページ内リンクOK)

・http://subdomain.domain.info/aaa/1234
→ OK
(手入力 http://subdomain.domain.info/bbb/1234.html → OK)

・http://subdomain.domain.info/bbb/ddd/
→ 表示されるが、表示が崩れ、ページの内同じディレクトリのリンクが404
(手入力 http://subdomain.domain.info/bbb/ddd.html → OK)

・http://subdomain.domain.info/ccc/eee/fff/
→ 表示されるが、表示が崩れ、ページの内同じディレクトリのリンクが404
(手入力 http://subdomain.domain.info/ccc/eee/fff.html → OK)

■質問
.htaccessを修正することで、表示が崩れず、xxx.htmlと同様の表示になる方法を教えて欲しい

■補足
レンタルサーバ: X SERVER
WEBサーバー: nginx

・ー・<最初の質問・ここから>ー・ー・ー・ー・ー・ー・ー・

URLに.(ドット)を含まない場合はディレクトリと見なして末尾スラッシュ補完

.htaccess初心者です。希望は、
「.htaccessで、URLに.(ドット)を含まない場合はディレクトリと見なさないで末尾に.html補完をさせたい」です。
ちなみに、このような例文をネットで教えていただきました。

RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !\.[^/\.]+$
RewriteRule .* %{REQUEST_URI}/ [L,R]

もしかして、「.htaccessで、URLに.(ドット)を含まない場合はディレクトリと見なさないで末尾に.htmlを補完させたい」を実現できるのではないかと思い、質問させていただきます。

何卒、よろしくお願いいたします。

・ー・<最初の質問・ここまで>ー・ー・ー・ー・ー・ー・ー・

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

文字通りの「URLに.(ドット)を含まない場合」だと、URLのドメイン部分に必ずドットはあるので、該当URL無しです。

「URLのパス名部分にURLに.(ドット)を含まない場合は末尾に.htmlを補完」なら、必要十分な記述は、

RewriteEngine On
RewriteCond %{REQUEST_URI} !\.
RewriteRule .* %{REQUEST_URI}.html [L] 


です。リダイレクトしたい場合(HTMLファイルの内容を応答するだけじゃなくて、ブラウザのアドレスバーも書き換えたい場合)は、[L][L,R=301]にします。

これだと、

https://example.com/            ⇒ https://example.com/.html
https://example.com/foo/        ⇒ https://example.com/foo/.html
https://example.com/foo.bar     ⇒ https://example.com/foo.bar
https://example.com/foo.bar/baz ⇒ https://example.com/foo.bar/baz


で、1つめと2つめは多分まずそうです。「そういう名前のファイルが存在するときは」を条件に加えると、

RewriteEngine On
RewriteCond %{REQUEST_URI} !\.
#RewriteCond %{REQUEST_URI}.html -f ・・・・・この行間違い
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule .* %{REQUEST_URI}.html [L] 


4つ目のような、ディレクトリ部分にのみドットがある場合にも.htmlを付ける場合は、
2行目の!\.を引用されているような!\.[^/\.]+$にします。
(2つ目の\は不要なので!\.[^/.]+$でいいです)

追記

すいません。まず前回の付け足し部分に間違いがありましたので訂正しておきます。
REQUEST_URIREQUEST_FILENAME

最初の質問と違いますね。
というか、最初の質問が書き足りてなかったのか。今後の質問では、最初からちゃんと全部書いてください。

http://example.com/dir に.htmlを付加するだけでなく  http://example.com/dir/ に対して末尾の/を取って.htmlを付加するのであれば、

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule .* %{REQUEST_URI}.html [L]
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_FILENAME}../$1.html -f
RewriteRule (.*)/$ $1.html [L]


で、どうでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/22 14:41 編集

    > 上記の状態で、「新着情報北竜町ポータル」と検索しアクセスすると、
    とか、どこをクリックしたとかはどうでも良いので、

    .htaccessその他のリライト・リダイレクト関係全てと、
    ディレクトリ・ファイル構成と、
    その状態で「どういうURLを入力したら、どういう結果になるのか」を網羅的に書いてください。

    全て質問に「コードブロック」で追記してください。

    キャンセル

  • 2020/01/23 14:40

    otnさん、コメントありがとうございます。
    質問に追記します。よろしくお願いします。

    キャンセル

  • 2020/01/23 17:22

    今、質問への追記完了しました。このよう形で理解できますでしょうか。よろしくお願いいたします。

    キャンセル

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

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる