htmlで終わらないファイルをキャッチするための.htaccessのRewriteengine
-
03-07-2019 - |
質問
標準のLAMPホスティングの状況で、mod rewrite inを使用して / directory などのWebページアドレスを /directory/index.html に変換したい。私が持っているものは、スラッシュで終わるアドレスに対して機能します。 スラッシュで終わらないアドレスを処理する方法が見つかりません。
動作するように思われるものは次のとおりです:
rewriterule ^(.*)/$ $1/index.html [L] /* addresses ending in / */
rewriterule ^(.*(?!html))$ $1/index.html [L] /* where the problem is */
ただし、2行目では500サーバーエラーが発生します。 1行目の文字xを2行目に追加すると:
rewriterule ^(.*)/$ $1/index.html [L]
rewriterule ^(.*x(?!html))$ $1/index.html [L]
機能し始めますが、 xで終わるディレクトリ名のみ。 xをさまざまなものに置き換えてみました。実際の文字よりも複雑なもの([^ x]や。+など)は500サーバーエラーになります。
そして、私自身の好奇心を満たすために、実際の文字を1つ追加するだけでサーバーエラーと完全に機能するルールが異なる理由を誰もが知っていますか?
[承認済みの回答] Gumboのおかげで、rewritecondを使用してソリューションを近似できました。
rewritecond %{REQUEST_URI} !\.[^/]+$ rewriterule (.+) $1/index.html [L]
これは機能しますが、.html以外にもフィルタリングします-他のページをブロックすることがあります。残念ながら、
rewritecond %{REQUEST_URI} !\.html$
サーバーエラーが発生します:
リクエストは、構成エラーの可能性があるため、10の内部リダイレクトの制限を超えました。必要に応じて、「LimitInternalRecursion」を使用して制限を増やします。
まだ理由を知りたい:
rewriterule ^(.*(?!html))$ $1/index.html [L]
ループが発生します。前半は、.htmlで終わらないかどうかをチェックすることになっています。 後半は.htmlを追加する ので、機能的には次のようになります:
while(substr($address,-4)!='html') $address.='html'
明らかに何かが欠けています。
解決
RewriteCond
ディレクティブを使用して、URLパスが .html
で終わっていないかどうかを確認します。
RewriteCond %{REQUEST_URI} !\.html$
RewriteRule ^(.*[^/])?/?$ $1/index.html [L]
編集   あなたは先読みアサーション((?!…)
)を使用しています。しかし、。*
の後には何もありません( $
のみ)。そのため、代わりに後読みアサーションを試してください:
RewriteRule ^.*$(?<!html) <*>/index.html [L]
ただし、これらのアサーションを使用するにはApache 2.2が必要になる可能性があることに注意してください。
他のヒント
まあ、実際に動作させるには、先読みの代わりにネガティブな後読みを使用するだけです:
RewriteRule ^(.*)(?<!html)$ $1/index.html [L]
「x」を追加することがなぜ機能するのかわからないので、わかったら編集します。
x
を追加すると機能する理由:
置換が正規表現と一致する場合、RewriteRuleが再度適用されます。例として、これによりエラーが発生します。
RewriteRule ^(.*)$ $1.rb
script
を script.rb
に置き換えるためです。これは正規表現と一致するため、 script.rb
を script.rb.rb
に何度も置き換えます...
これはエラーログで示唆されています:
Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary.
この例では、index.htmlを最後に追加します。正規表現の最後に x
がある場合、置換とは一致せず、 l
で終わります。