web-dev-qa-db-ja.com

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

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

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

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

9
Richard1984

このルールで行うことは、URLに末尾の/がなく、URIに.がない場合にhttps://example.org/testhttps://example.org/test/にリダイレクトすることですが、https://example.org/test.htmlhttps://example.org/test.html/に書き換えられません(ただし、https://example.org/test.case/folderもURIにhttps://example.org/test.case/folder/が含まれているため、.にリダイレクトされません)。

## 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]
11
Sven

検証せずに、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]
6
Joffrey