apache2.4 mod_rewrite loại trừ bí danh cụ thể directroy / uri


11

Tôi có thiết lập sau trên một trong những vhost của mình:

...<VirtualHost *:80>
    ServerName cloud.domain.de
    ServerAdmin webmaster@domain.de
    ServerSignature Off

    Alias "/.well-known/acme-challenge" "/var/www/domain.de/vh-www/htdocs/public/.well-known/acme-challenge"

    <Directory "/var/www/domain.de/vh-www/htdocs/public/.well-known/acme-challenge">
      Require all granted
      ForceType 'text/plain'
    </Directory>

    <ifmodule mod_rewrite.c>
      RewriteEngine On
      RewriteCond %(REQUEST_URI) !/\.well\-known/acme\-challenge/?.*
      RewriteCond %{HTTPS} off
      # RewriteRule ^\.well-known/acme-challenge/([A-Za-z0-9-]+)/?$ - [L]
      RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    </ifmodule>...

Những gì tôi muốn đạt được là, mod_rewrite không viết lại URL khi url http://cloud.domain.de/.well-known/acme-challenge/được truy cập.

Tôi đã thử các cách tiếp cận khác nhau, một trong số chúng là RewriteRule đã nhận xét ở trên, nhưng dường như không có gì hoạt động: máy chủ viết lại nó thành https mọi lúc.

Khi tôi vô hiệu hóa việc viết lại cho mục đích thử nghiệm, tôi có thể truy cập URL bí danh tốt ...

Làm cách nào để đạt được URL cụ thể không bị viết lại?

Câu trả lời:


16

Như thế

<ifmodule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</ifmodule>

Nếu URI khớp start with /.well-known/acme-challenge/với yêu cầu sẽ không được chuyển hướng


Đầu tiên, cảm ơn lời khuyên của bạn! Thật không may, nó đã không làm việc. Khi bạn truy cập: http://www.server-plant.de/.well-known/acme-challenge/nó vẫn đang được viết lại. (Tôi đã áp dụng các Quy tắc và Điều kiện Viết lại tương tự cho Tên miền phụ www của mình, do đó, nó hoàn toàn giống với Tên miền con trên đám mây)
FleBeling

Đã chỉnh sửa: đã có () thay vì {} và RewriteCond %{HTTPS} offkhông được yêu cầu
Froggiz

Vâng, tôi chỉ sao chép một cách mù quáng của bạn mà không kiểm tra dấu ngoặc đúng, nhưng ừm, xảy ra :) Bây giờ nó hoạt động như bùa mê và bạn cũng đúng về điều kiện khác. Chỉ còn một câu hỏi: Làm thế nào để thay đổi điều kiện để phù hợp với mọi thứ đằng sau dấu vết /? Vì vậy, nó sẽ không bắt index.html và như vậy?
FleBeling

nó cũng phù hợp với tất cả start with /.well-known/acme-challenge/điều đó có nghĩa là /.well-known/acme-challenge/anythingsẽ không được chuyển hướng nữa
Froggiz

1
Các cấu hình viết lại có thể được kế thừa cho tất cả các máy chủ ảo RewriteOptions InheritDownkể từ Apache 2.4.8. RewriteEngine Onvẫn còn hiện diện trong mỗi cấu hình máy chủ ảo.
tobltobs

3

@mark Phiên bản chính xác của biến thể "ngắn hơn và mạnh hơn":

RewriteCond %{REQUEST_URI} ^/\.well\-known
RewriteRule . - [L]

thêm điều này để ngăn chặn các quy tắc chuyển hướng ssl bên dưới thật tuyệt vời
James Tan

Dấu chấm đơn trong dòng 2 không hoạt động với tôi. Có phải vì nó chỉ khớp với một char và url bao gồm nhiều ký tự? Tôi đang sử dụng ^ (. *) $ Thay vào đó.
Jette

0

IMHO ngắn hơn và mạnh mẽ hơn:

RewriteCond %{REQUEST_URI} ^\.well\-known
RewriteRule - [L]

bạn có thể muốn thêm / acme-thử thách / cuối cùng nhưng nếu bạn muốn gỡ lỗi nó bằng một tệp tùy ý, như ./well- Unknown / test thì giải pháp này hoạt động tốt hơn

nó thực sự làm gì: xem liệu yêu cầu bắt đầu bằng .well-biết, trong trường hợp đó không làm gì cả (ý nghĩa của -) và biến nó thành quy tắc cuối cùng [L]


không Các Virtualhost dường như vẫn được ưu tiên. "Các phần bên trong các phần <Virtualhost> được áp dụng sau các phần tương ứng bên ngoài định nghĩa máy chủ ảo. Điều này cho phép máy chủ ảo ghi đè cấu hình máy chủ chính." từ httpd.apache.org/docs/civerse/sections.html
Frederick Nord
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.