apache2.4 mod_rewrite mengecualikan alias directroy / uri tertentu

11

Saya memiliki pengaturan berikut di salah satu vhost saya:

...<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>...

Yang ingin saya capai adalah, mod_rewrite itu tidak menulis ulang URL ketika url http://cloud.domain.de/.well-known/acme-challenge/diakses.

Saya sudah mencoba berbagai pendekatan, salah satunya adalah RewriteRule yang sudah dikomentari di atas, tetapi tampaknya tidak ada yang berhasil: server menulis ulang untuk https setiap saat.

Ketika saya menonaktifkan penulisan ulang untuk tujuan pengujian, saya dapat mengakses URL alias ...

Bagaimana cara mencapai URL spesifik yang tidak ditulis ulang?

FleBeling
sumber

Jawaban:

16

Seperti itu :

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

Jika URI cocok start with /.well-known/acme-challenge/dengan permintaan tidak akan dialihkan

Froggiz
sumber
Pertama, terima kasih atas saran Anda! Sayangnya, itu tidak berhasil. Ketika Anda mengunjungi: http://www.server-plant.de/.well-known/acme-challenge/masih sedang ditulis ulang. (Saya menerapkan Aturan dan Ketentuan Penulisan Ulang yang sama untuk www-Subdomain saya, jadi itu sangat sama dengan cloud-Subdomain)
FleBeling
Diedit: ada () bukannya {} dan RewriteCond %{HTTPS} offtidak
diminta kembali
Ya, saya hanya menyalin secara membuta milik Anda tanpa memeriksa tanda kurung yang tepat, tetapi yah, sh .. terjadi :) Sekarang berfungsi seperti pesona dan Anda juga benar mengenai kondisi lainnya. Tinggal satu pertanyaan lagi: Bagaimana mengubah kondisi agar sesuai dengan semua yang ada di belakangnya /? Jadi itu tidak akan menangkap index.html dan seterusnya?
FleBeling
itu sudah cocok dengan semua start with /.well-known/acme-challenge/yang berarti /.well-known/acme-challenge/anythingtidak akan dialihkan juga
Froggiz
1
Konfigurasi RewriteOptions InheritDownpenulisan ulang dapat diwarisi ke semua host virtual dengan sejak Apache 2.4.8. RewriteEngine Onmasih harus ada di setiap konfigurasi host virtual.
tobltobs
3

@mark Versi yang benar dari varian "lebih pendek dan lebih kuat":

RewriteCond %{REQUEST_URI} ^/\.well\-known
RewriteRule . - [L]
pikiran yang jauh
sumber
menambahkan ini untuk menghentikan aturan pengalihan ssl di bawah ini luar biasa
James Tan
Titik tunggal pada baris 2 tidak berfungsi untuk saya. Apakah karena hanya cocok dengan satu karakter dan url terdiri dari beberapa karakter? Saya menggunakan ^ (. *) $ Sebagai gantinya.
Jette
0

IMHO lebih pendek dan lebih kuat:

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

Anda mungkin ingin menambahkan / acme-challenge / akhirnya tetapi jika Anda ingin men-debug dengan file yang sewenang-wenang, seperti ./well-known/test solusi ini berfungsi lebih baik

apa yang sebenarnya ia lakukan: melihat apakah permintaan dimulai dengan .sudah diketahui, dalam hal itu tidak melakukan apa-apa (arti dari -) dan menjadikannya aturan terakhir [L]

Mark Hofstetter
sumber
nggak. Virtualhosts tampaknya masih memiliki prioritas. "Bagian di dalam bagian <VirtualHost> diterapkan setelah bagian yang sesuai di luar definisi host virtual. Ini memungkinkan host virtual untuk mengesampingkan konfigurasi server utama." dari httpd.apache.org/docs/current/sections.html
Frederick Nord