Bagaimana cara menggunakan jalur RELATIF dengan AuthUserFile di htaccess?

98

Saya memiliki .htaccess yang menggunakan otentikasi dasar. Tampaknya jalur ke file .htpasswd tidak terkait dengan file htaccess, melainkan ke konfigurasi server.

Jadi meskipun saya memiliki file .htaccess dan .htpasswd di direktori yang sama, ini tidak berfungsi:

AuthType Basic
AuthName "Private Login"
AuthUserFile .htpasswd
Require valid-user

Namun, ini berfungsi jika saya mengubah AuthUserFile untuk menggunakan jalur absolut:

AuthType Basic
AuthName "Private Login"
AuthUserFile "/home/user/public_html/mydir/.htpasswd"
Require valid-user

Tapi saya lebih suka sesuatu yang lebih mobile karena saya menggunakan ini di banyak situs di area berbeda. Saya telah mencari di web tetapi belum menemukan resolusi apa pun. Apakah mungkin menggunakan jalur relatif atau variabel seperti itu %{DOCUMENT_ROOT}?

DssTrainer
sumber

Jawaban:

51

Tidak mungkin menggunakan jalur relatif untuk AuthUserFile :

File-path adalah jalur ke file pengguna. Jika tidak absolut (yaitu, jika tidak dimulai dengan garis miring), ini dianggap relatif terhadap ServerRoot.

Anda harus menerima dan mengatasi batasan itu.


Kami menggunakan IfDefinebersama dengan parameter baris perintah apache2 :

.htaccess (cocok untuk pengembangan dan sistem langsung):

<IfDefine !development>
  AuthType Basic
  AuthName "Say the secret word"
  AuthUserFile /var/www/hostname/.htpasswd
  Require valid-user
</IfDefine>

Konfigurasi server pengembangan (Debian)

Tambahkan yang berikut ini ke /etc/apache2/envvars:

export APACHE_ARGUMENTS=-Ddevelopment

Mulai ulang apache Anda setelah itu dan Anda akan mendapatkan prompt kata sandi hanya jika Anda tidak berada di server pengembangan.

Anda tentu saja dapat menambahkan IfDefine lain untuk server pengembangan, cukup salin blok dan hapus file !.

cweiske.dll
sumber
4
Tapi ini masih menggunakan jalur absolut ( /var/...) - dan pertanyaannya menanyakan: "bagaimana menggunakan jalur relatif"?
sdaau
1
Dan kemudian pertanyaannya diedit untuk menjawab dengan benar dengan "tidak" :)
Erenor Paz
15

Untuk berjaga-jaga jika orang mencari solusi untuk ini:

<If "req('Host') = 'www.example.com'">
    Authtype Basic
    AuthName "user and password"
    AuthUserFile /var/www/www.example.com/.htpasswd
    Require valid-user
</If>
topeng8
sumber
1
Ini akan bagus, tetapi apakah aman untuk diandalkan req('Host'), tidak bisakah klien mengelabui nilai ini?
Marco Demaio
1
@MarcoDemaio Ya, ini dapat / dapat diakali dengan menggunakan, misalnya, alamat IP. Itu tergantung pada konfigurasi Anda. Ini bukan ya atau tidak mutlak. Tergantung.
Maxime
12

1) Perhatikan bahwa dianggap tidak aman untuk memiliki .htpasswdfile di bawah root server.

2) Dokumen mengatakan ini tentang jalur relatif, jadi sepertinya Anda kurang beruntung:

File-path adalah jalur ke file pengguna. Jika tidak absolut (yaitu, jika tidak dimulai dengan garis miring), ini dianggap relatif terhadap ServerRoot .

3) Sementara jawaban yang merekomendasikan penggunaan variabel lingkungan berfungsi dengan baik, saya lebih suka meletakkan placeholder di .htaccessfile, atau memiliki versi berbeda dalam basis kode saya, dan meminta proses penerapan mengatur semuanya (yaitu mengganti placeholder atau mengganti nama / pindahkan file yang sesuai).

Pada proyek Java, saya menggunakan Maven untuk melakukan jenis pekerjaan ini, katakanlah, proyek PHP, saya ingin memiliki skrip shell build.sh dan / atau install.sh yang menyesuaikan file yang diterapkan ke lingkungannya. Ini memisahkan basis kode Anda dari spesifikasi lingkungan targetnya (yaitu variabel lingkungan dan parameter konfigurasi). Secara umum, aplikasi harus beradaptasi dengan lingkungan, jika Anda melakukannya dengan cara lain, Anda mungkin mengalami masalah setelah lingkungan juga harus memenuhi aplikasi yang berbeda, atau untuk persyaratan khusus sistem yang sama sekali tidak terkait.

Hanno Fietz
sumber
8

Anda dapat menempatkan pengaturan Auth Anda ke dalam Lingkungan. Suka:

SetEnvIf HTTP_HOST testsite.local APPLICATION_ENV=development
<IfDefine !APPLICATION_ENV>
  Allow from all
  AuthType Basic
  AuthName "My Testseite - Login" 
  AuthUserFile /Users/tho/htdocs/wgh_staging/.htpasswd
  Require user username
</IfDefine>

Auth berfungsi, tetapi saya tidak dapat menjalankan lingkungan saya.

digitaldonkey
sumber
1
Saya pikir masalahnya adalah ini: "Hanya variabel lingkungan yang ditentukan oleh arahan SetEnvIf [NoCase] ​​sebelumnya yang tersedia untuk pengujian dengan cara ini. 'Sebelumnya' berarti bahwa mereka didefinisikan pada lingkup yang lebih luas (seperti server-lebar) atau sebelumnya ruang lingkup arahan saat ini. " (Ditemukan di sini: askapache.com/htaccess/setenvif.html ) Karena Anda memiliki cakupan yang sama, Anda tidak dapat menjalankan lingkungan Anda.
pengguna470370
4
mengapa ini tidak berfungsi sangat baik dijelaskan di sini stackoverflow.com/questions/11073752/…
nico gawenda
Tapi ini masih menggunakan jalur absolut ( /Users/...) - dan pertanyaannya menanyakan: "bagaimana menggunakan jalur relatif"?
sdaau
Iya. Tetapi Anda dapat menggunakan beberapa pengaturan APPLICATION_ENV untuk menggunakan beberapa jalur absolut per lingkungan.
digitaldonkey
5

.htpasswd membutuhkan jalur absolut penuh dari root absolut server.

Silakan dapatkan path absolut lengkap dari file dengan echo echo $_SERVER['DOCUMENT_ROOT'];.

di sini bekerja skrip auth .htaccess dasar.

AuthType Basic
AuthName "Access to the Hidden Files"
AuthUserFile 'C:/xampp/htdocs/ht/.htpasswd'
Require valid-user

Sebelum masuk

masukkan deskripsi gambar di sini

Setelah Login

masukkan deskripsi gambar di sini

muni
sumber
3

Jika Anda mencoba menggunakan XAMPP dengan Windows dan ingin menggunakan file .htaccess di server langsung dan juga mengembangkannya di mesin pengembangan XAMPP, berikut ini berfungsi dengan baik!


1) Setelah menginstal XAMPP baru, pastikan Apache diinstal sebagai layanan.

  • Ini dilakukan dengan membuka XAMPP Control Panel dan mengklik "X" kecil berwarna merah di sebelah kiri modul Apache.
  • Ini kemudian akan menanyakan Anda apakah Anda ingin menginstal Apache sebagai layanan.
  • Maka itu akan berubah menjadi tanda centang hijau.

2) Ketika Apache diinstal sebagai layanan, tambahkan variabel lingkungan baru sebagai tanda.

  • Pertama, hentikan layanan Apache dari Panel Kontrol XAMPP.
  • Selanjutnya buka prompt perintah. (Anda tahu jendela hitam kecil yang mensimulasikan DOS)
  • Ketik "C: \ Program Files (x86) \ xampp \ apache \ bin \ httpd.exe" -D "DEV" -k config .
  • Ini akan menambahkan tanda DEV baru ke variabel lingkungan yang dapat Anda gunakan nanti.

3) Jalankan Apache

  • Buka kembali Panel Kontrol XAMPP dan mulai layanan Apache.

4) Buat file .htaccess Anda dengan informasi berikut ...

<IfDefine DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/sandbox/web/scripts/.htpasswd"
  require valid-user
</IfDefine>

<IfDefine !DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/home/arvo/public_html/scripts/.htpasswd"
  require valid-user
</IfDefine>

Untuk menjelaskan skrip di atas berikut adalah beberapa catatan ...

  • AuthUserFile saya didasarkan pada pengaturan dan preferensi pribadi saya.
  • Saya memiliki kotak dev pengujian lokal yang halaman web saya terletak di c: \ sandbox \ web \ . Di dalam folder itu saya memiliki folder bernama skrip yang berisi file kata sandi .htpasswd .
  • Entri pertama IfDefine DEV digunakan untuk contoh itu. Jika DEV diatur (seperti yang kita lakukan di atas, hanya pada mesin dev yang kasar) maka akan menggunakan entri itu.
  • Dan pada gilirannya jika menggunakan server live IfDefine! DEV akan digunakan.

5) Buat file kata sandi Anda (dalam hal ini bernama .htpasswd) dengan informasi berikut ...

pengguna: $ apr1 $ EPuSBcwO $ / KtqDUttQMNUa5lGXSOzk.

Beberapa hal yang perlu diperhatikan ...

Arvo Bowen
sumber
Tapi ini masih menggunakan jalur absolut ( /home...) - dan pertanyaannya menanyakan: "bagaimana menggunakan jalur relatif"?
sdaau
2

atau jika Anda mengembangkan di localhost (hanya untuk apache 2.4+):

<If "%{REMOTE_ADDR} != '127.0.0.1'">
</If>
amxm
sumber
1

Saya tahu ini adalah pertanyaan lama, tetapi saya baru saja mencari hal yang sama dan mungkin ada banyak orang lain yang mencari solusi seluler yang cepat. Inilah yang akhirnya saya temukan:

# We set production environment by default
SetEnv PROD_ENV 1

<IfDefine DEV_ENV>
  # If 'DEV_ENV' has been defined, then unset the PROD_ENV
  UnsetEnv PROD_ENV

  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /var/www/foo.local/.htpasswd
  Require valid-user
</IfDefine>

<IfDefine PROD_ENV>
  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /home/foo/public_html/.htpasswd
  Require valid-user
</IfDefine>
ovi
sumber
Tapi ini masih menggunakan jalur absolut ( /var...) - dan pertanyaannya menanyakan: "bagaimana menggunakan jalur relatif"?
sdaau
1
Ya, ini adalah solusi, karena Apache tidak mendukung jalur relatif ke lokasi .htaccessfile. Jika Anda menggunakan jalur relatif, ini akan dianggap relatif terhadap ServerRoot.
ovi
1

Mari kita ambil contoh.

Aplikasi Anda terletak di / var / www / myApp di beberapa server Linux

.htaccess : /var/www/myApp/.htaccess

htpasswdApp : / var / www / myApp / htpasswdApp . (Anda bebas menggunakan nama apa pun untuk file .htpasswd )

Untuk menggunakan jalur relatif di .htaccess :

AuthType Digest
AuthName myApp
AuthUserFile "htpasswdApp"
Require valid-user

Tetapi itu akan mencari file di direktori server_root . Tidak di document_root .

Dalam kasus keluar, ketika aplikasi terletak di / var / www / myApp :

document_root adalah / var / www / myApp

server_root adalah / etc / apache2 // (hanya di contoh kami, karena kami menggunakan server linux )

Anda dapat mendefinisikannya kembali di file konfigurasi apache Anda ( /etc/apache2/apache2.conf ), tapi saya rasa itu ide yang buruk.

Jadi untuk menggunakan jalur file relatif di /var/www/myApp/.htaccess Anda harus menentukan file kata sandi di server_root Anda .

Saya lebih suka melakukannya dengan mengikuti perintah:

sudo ln -s /var/www/myApp/htpasswdApp /etc/apache2/htpasswdApp

Anda bebas menyalin perintah saya, menggunakan tautan keras alih-alih simbol, atau menyalin file ke server_root Anda .

Sild
sumber
1
karena apache memblokir akses ke file yang dimulai dengan .ht * secara default, tidak disarankan untuk menggunakan nama acak untuk file tersebut.
cari