apache2.4 mod_rewrite wyklucza określony alias directroy / uri

11

Mam następującą konfigurację na jednym z moich vhostów:

...<VirtualHost *:80>
    ServerName cloud.domain.de
    ServerAdmin [email protected]
    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>...

Chcę osiągnąć to, że mod_rewrite nie przepisuje adresu URL po uzyskaniu http://cloud.domain.de/.well-known/acme-challenge/dostępu do adresu URL .

Próbowałem już różnych podejść, jednym z nich jest skomentowany przepis RewriteRule powyżej, ale wydaje się, że nic nie działa: serwer przepisuje go do https za każdym razem.

Po wyłączeniu przepisywania na potrzeby testów mogę uzyskać dostęp do aliasu URL w porządku ...

Jak mogę nie przepisać konkretnego adresu URL?

FleBeling
źródło

Odpowiedzi:

16

W ten sposób:

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

Jeśli identyfikator URI jest zgodny, start with /.well-known/acme-challenge/żądanie nie zostanie przekierowane

Froggiz
źródło
Po pierwsze, dziękuję za radę! Niestety nie zadziałało. Podczas wizyty: http://www.server-plant.de/.well-known/acme-challenge/wciąż jest przepisywany. (Zastosowałem te same Reguły Przepisywania dla mojej Subdomeny www, więc jest to dokładnie to samo co Subdomeny chmurowej)
FleBeling
Edytowano: zamiast {} był () i RewriteCond %{HTTPS} offnie jest
wymagany
Tak, właśnie skopiowałem twój na ślepo, nie sprawdzając odpowiednich nawiasów, ale no cóż, zdarza się :) Teraz to działa jak urok i masz rację również w odniesieniu do innych warunków. Pozostało tylko jedno pytanie: jak zmienić warunek, aby dopasować wszystko do tyłu /? Więc nie przechwyciłby index.html i tak dalej?
FleBeling
już pasuje do start with /.well-known/acme-challenge/tego, co oznacza, /.well-known/acme-challenge/anythingże nie będzie też przekierowywania
Froggiz
1
Konfiguracje przepisz mogą być dziedziczone na wszystkich wirtualnych hostach RewriteOptions InheritDownod Apache 2.4.8. RewriteEngine Onwciąż musi być obecny w każdej konfiguracji hosta wirtualnego.
tobltobs
3

@mark Prawidłowa wersja „krótszego i solidniejszego” wariantu:

RewriteCond %{REQUEST_URI} ^/\.well\-known
RewriteRule . - [L]
zdalny umysł
źródło
dodanie tego, aby zatrzymać reguły przekierowania ssl poniżej, jest niesamowite
James Tan
Pojedyncza kropka w wierszu 2 nie działała dla mnie. Czy to dlatego, że pasuje tylko do jednego znaku, a adres URL składa się z kilku znaków? Zamiast tego używam ^ (. *) $.
Jette
0

IMHO krótszy i bardziej wytrzymały:

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

możesz chcieć dodać / acme-challenge / ostatecznie, ale jeśli chcesz debugować go za pomocą dowolnego pliku, takiego jak ./well-known/test, to rozwiązanie działa lepiej

co to właściwie robi: sprawdza, czy żądanie zaczyna się od .well-znane, w tym przypadku nic nie robi (znaczenie -) i czyni go ostatnią regułą [L]

Mark Hofstetter
źródło
nie. Wirtualne hosty nadal wydają się mieć pierwszeństwo. „Sekcje wewnątrz sekcji <VirtualHost> są stosowane po odpowiednich sekcjach poza definicją wirtualnego hosta. Pozwala to wirtualnym hostom na zastąpienie konfiguracji głównego serwera.” from httpd.apache.org/docs/current/sections.html
Frederick Nord