1

私は htaccess mod_rewrite を理解するのに苦労しており、いくつかの関連する質問と回答を見つけましたが、残念ながら、非常に特定の状況を正しく機能させることができません (mod_rewrite は、7 つのシールの本を何時間も検索した後でさえ、正直に言うと)

ルート ディレクトリ内に foo.html と bar.html があります。今、私はデフォルトのディレクトリインデックスとして foo.html を持ちたいのですが(解決済み、簡単です)、そこから取得できません。

私が達成したいことは次のとおりです。

  1. .html 拡張子を非表示にすると、ユーザーは .html を表示せずに入力して取得
    できるはずです(すべての .html について) /bar/bar.html
  2. 301 リダイレクト .html バージョンのユーザーは、URL に入力して表示
    できる必要があります(.html ごとに重複を避けてください)。 /bar.html/bar
  3. 最もトリッキーな部分:デフォルトのディレクトリ インデックスと
    同様に、 / と入力するとfoo.html既に (透過的に) が表示されますが、/ に解決するには /foo と入力するだけでなく、 / に解決するためにも /foo.html入力する必要があります。/foo.html
4

2 に答える 2

1

これらのルールをドキュメント ルートの htaccess ファイルに追加してみてください。

RewriteEngine

# 1. hiding the .html extensions
RewriteCond %{REQUEST_URI} ^/(.*?)/?$
RewriteCond %{DOCUMENT_ROOT}/%1.html -f
RewriteRule ^ /%1.html [L]

# 2. 301 redirecting .html version
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.html
RewriteCond %1 !foo$
RewriteRule ^ /%1 [L,R=301]

# 3. typing /foo.html to resolve to / as well as typing /foo to resolve to / 
RewriteCond %{REQUEST_URI} ^/(.*?/?)foo(\.html)?$
RewriteRule ^ /%1 [L,R=301]

また、マルチビューがオフになっていることを確認してください。

Options -Multiviews

最初のルールには 2 つの条件があります。最初のルールは、最初の/と可能性のある最後の の間のすべての URI をグループ化し/ます。は、存在するファイルかどうかを確認する次の条件で%1を使用して参照します。両方とも true の場合、最後/path/to/www/document/root/%1.htmlに a を含むように URI を内部的に書き換えます。.html

2 番目のルールには 2 つの条件があり、最初の一致は URI ではなく実際のリクエストと一致します (ルールが適用され、書き換えが発生すると変更される可能性があります)。で終わるリクエストがある.htmlかどうかを確認し、そうであれば、2 番目の条件でそれがリクエストではないことを確認しますfoo.html(最後のルールがそれを処理するため)。両方が true の場合、ブラウザーを html のない URI の部分にリダイレクトし、%1を使用して最初の condition からの一致のグループ化を参照します([^\ ]+)

foo最後のルールは、リクエストがかかどうかをチェックしますfoo.html。その場合は、URI のその部分を削除してリダイレクトします。

于 2012-10-04T23:21:13.303 に答える