htaccessルールを理解できません


9

私のhtaccessにこれがありますが、その目的がわかりません。ルールの性質上、検索も役に立ちません。

RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301]

誰もがそれについて何を説明できますか?


リクエスト部分(URLの「.com」の後の部分)がa /で終わらず、「.」が含まれていない場合は、を追加してリクエストをリダイレクトし/ます。このルールの目的は、自動ディレクトリインデックスを処理することです。
peterh-モニカを復活させる

回答:


11

このルールはありませんすべては末尾を追加することです/。存在しない場合は、あなたのURLへと何がある場合は.URIで、そうhttps://example.org/testにリダイレクトされませんhttps://example.org/test/が、https://example.org/test.htmlに書き換えされることはありませんhttps://example.org/test.html/(ただし、注:https://example.org/test.case/folderまたうではないにリダイレクトされhttps://example.org/test.case/folder/、それが含まれているとして.URIのa )。

## Do the following if the URI does not end with `/` or  does not contain an `.`: 
## the . is relevant for file names like test.html, which should n 
RewriteCond %{REQUEST_URI} !(/$|\.)

## Redirect it to the original URI with an added `/` and mark this as permanent:
RewriteRule (.*) %{REQUEST_URI}/ [R=301]

/test.case/folderまたリダイレクトされません」-マイナーなポイントですが、「フォルダ」がファイルシステムディレクトリの場合、mod_dirは(デフォルトで)301リダイレクトを発行して末尾にスラッシュを追加します。/test.case/some-other-virtual-url末尾にスラッシュが必要な場合のみ問題になります。
MrWhite

6

検証せずに、Apacheリライトでの私の経験を使用すると、この構成は次のようになります。

  1. URIの「パス」部分(サーバー、ポート、クエリパラメータではない)に一致します(例:「/my/location/file.html」)。
  2. この部分が「/」(スラッシュ)文字で終わっていない場合に一致します。または、「。」が含まれていません。(ドット)文字。
  3. URIの絶対パス部分を使用し、それにスラッシュを追加します。
  4. HTTP 301(永続的)リダイレクトを送信して、ブラウザをこの新しいURIにリダイレクトします。

これにより、次のテストケースが発生します。

/ -> / /test -> /test/ /my/resource -> /my/resource/ /my/resource.type -> /my/resource.type /edge.case/resource -> /edge.case/resource

したがって、このルールには、ファイルではないように見えるリソースにスラッシュを追加する目的があると思いますが、エッジケースがあるようです。

そうでない場合、「。」を使用してリソースにスラッシュを追加します。パスのファイル以外の部分の(ドット)文字正規表現は次のように変更する必要があります。

# match paths which do not end with a slash, or do not resemble a file with an extension
RewriteCond %{REQUEST_URI} !(/$|\.[^/]+$)
# redirect permanently to the same uri with a slash
RewriteRule (.*) %{REQUEST_URI}/ [R=301]

!(\/$|\.[^\/]*)-あなたの更新された正規表現は本当に違いはありません。2番目の部分(拡張子と一致する)にも文字列の終わりのアンカーが必要です。おそらく次のようなものです!(/|\.[a-zA-Z]+)$(スラッシュをエスケープする必要はありません)。
MrWhite

@MrWhiteグッドキャッチ!回答を更新しました!
ジョフリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.