Không thể tìm ra quy tắc htaccess


9

Tôi có cái này trong htaccess của tôi nhưng không thể hiểu nó dùng để làm gì. Do bản chất của quy tắc, tìm kiếm cũng không giúp được gì.

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

Bất cứ ai có thể xin vui lòng giải thích những gì nó cho?


Nếu phần yêu cầu (phần của URL sau ".com") không kết thúc bằng a /và nó không chứa " .", thì hãy chuyển hướng yêu cầu bằng cách nối nó với a /. Mục đích có thể xảy ra của quy tắc này là xử lý lập chỉ mục thư mục tự động.
peterh - Tái lập Monica

Câu trả lời:


11

Tất cả quy tắc này là để thêm một dấu /vào URLS của bạn nếu không có và nếu không có .trong URI, do đó https://example.org/testsẽ được chuyển hướng đến https://example.org/test/, nhưng https://example.org/test.htmlsẽ không được viết lại thành https://example.org/test.html/(nhưng lưu ý: https://example.org/test.case/foldercũng sẽ không được chuyển hướng đến https://example.org/test.case/folder/vì nó chứa a .trong URI).

## 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/foldercũng sẽ không được chuyển hướng" - Điểm nhỏ, nhưng nếu "thư mục" là thư mục hệ thống tập tin, thì mod_dir sẽ (theo mặc định) sẽ đưa ra chuyển hướng 301 để nối thêm dấu gạch chéo. Đó chỉ là một vấn đề nếu đó là /test.case/some-other-virtual-urlmột dấu gạch chéo.
MrWhite

6

Không xác thực, nhưng sử dụng kinh nghiệm của tôi trong việc viết lại Apache, cấu hình này dường như:

  1. Khớp với phần 'đường dẫn' của URI (không phải thông số máy chủ, cổng hoặc truy vấn), ví dụ '/my/location/file.html'.
  2. Khớp nếu phần này không kết thúc bằng ký tự '/' (dấu gạch chéo), -hoặc- không bao gồm dấu '.' (chấm) ký tự.
  3. Sử dụng phần đường dẫn đầy đủ của URI và nối thêm dấu gạch chéo vào nó.
  4. Gửi chuyển hướng HTTP 301 (vĩnh viễn) để hướng trình duyệt tới URI mới này.

Điều này sẽ dẫn đến các trường hợp thử nghiệm sau đây

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

Vì vậy, tôi nghĩ rằng quy tắc này có mục đích thêm dấu gạch chéo vào các tài nguyên dường như không phải là một tệp, nhưng dường như nó có trường hợp cạnh.

Nếu không thêm dấu gạch chéo vào tài nguyên bằng '.' (dấu chấm) ký tự trong phần không phải tệp của đường dẫn biểu thức chính quy nên được thay đổi thành:

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

!(\/$|\.[^\/]*)- Regex cập nhật của bạn thực sự không khác. Bạn cũng cần một neo cuối chuỗi trên phần 2 (khớp với phần mở rộng). Có lẽ một cái gì đó như: !(/|\.[a-zA-Z]+)$(không cần phải thoát khỏi dấu gạch chéo).
MrWhite

@MrWhite Bắt tốt! Tôi đã cập nhật câu trả lời của tôi!
Joffrey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.