Htaccess'te AuthUserFile ile İLGİLİ bir yol nasıl kullanılır?


102

Temel kimlik doğrulamasını kullanan bir .htaccess'im var. .Htpasswd dosyasının yolu htaccess dosyasıyla değil, sunucu yapılandırmasıyla ilişkili görünüyor.

Yani aynı dizinde .htaccess ve .htpasswd dosyalarım olmasına rağmen bu çalışmıyor:

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

Ancak, AuthUserFile'ı mutlak yolu kullanacak şekilde değiştirirsem işe yarıyor:

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

Ancak bunu farklı alanlarda birden çok sitede kullandığım için daha mobil bir şey tercih ederim. İnternette arama yaptım ama herhangi bir çözüm bulamadım. Göreli yol veya benzeri değişkenler kullanmak mümkün mü %{DOCUMENT_ROOT}?

Yanıtlar:


52

AuthUserFile için göreli yollar kullanmak mümkün değildir :

Dosya-yolu, kullanıcı dosyasının yoludur. Mutlak değilse (yani, eğik çizgiyle başlamıyorsa), ile göreli olarak kabul edilir ServerRoot.

Bu sınırlamayı kabul etmeli ve bunun etrafında çalışmalısınız.


IfDefineApache2 komut satırı parametresiyle birlikte kullanıyoruz :

.htaccess (hem geliştirme hem de canlı sistemler için uygundur):

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

Geliştirme sunucusu yapılandırması (Debian)

Aşağıdakileri şuna ekleyin /etc/apache2/envvars:

export APACHE_ARGUMENTS=-Ddevelopment

Daha sonra apache'nizi yeniden başlatın ve yalnızca geliştirme sunucusunda olmadığınızda bir parola istemi alırsınız.

Tabii ki geliştirme sunucusu için başka bir IfDefine ekleyebilirsiniz, sadece bloğu kopyalayın ve !.


4
Ancak bu hala mutlak bir yol ( /var/...) kullanıyor - ve soru şu soruyu soruyor: "göreli bir yol nasıl kullanılır?"?
sdaau

1
Ve sonra soru "hayır" ile doğru şekilde cevaplanacak şekilde düzenlendi :)
Erenor Paz

15

İnsanların bunun için bir çözüm araması durumunda:

<If "req('Host') = 'www.example.com'">
    Authtype Basic
    AuthName "user and password"
    AuthUserFile /var/www/www.example.com/.htpasswd
    Require valid-user
</If>

1
Bu harika olurdu, ancak güvenmek güvenli req('Host')mi, müşteri bu değeri kandıramaz mı?
Marco Demaio

1
@MarcoDemaio Evet, örneğin IP adresi kullanılarak kandırılabilir / kandırılabilir. Yapılandırmanıza bağlıdır. Mutlak bir evet veya hayır değil. Değişir.
Maxime

12

1) .htpasswdDosyanın sunucu kökünün altında olmasının güvenli olmadığına dikkat edin .

2) Dokümanlar bunu göreceli yollar hakkında söylüyor, bu yüzden şansınız kalmadı gibi görünüyor:

Dosya-yolu, kullanıcı dosyasının yoludur. Mutlak değilse (yani, eğik çizgiyle başlamıyorsa), ServerRoot ile ilişkili olarak kabul edilir .

3) Ortam değişkenlerinin kullanımını öneren yanıtlar mükemmel şekilde çalışsa da, .htaccessdosyaya bir yer tutucu koymayı veya kod tabanımda farklı sürümlere sahip olmayı ve dağıtım sürecinin hepsini ayarlamasını tercih ederim (yani yer tutucuları değiştirin veya yeniden adlandırın / uygun dosyayı taşıyın).

Java projelerinde, bu tür işleri yapmak için Maven'i kullanıyorum, mesela PHP projelerinde, dağıtılan dosyaları ortamlarına göre ayarlayan bir build.sh ve / veya install.sh kabuk betiğine sahip olmayı seviyorum. Bu, kod tabanınızı hedef ortamının özelliklerinden (yani ortam değişkenleri ve yapılandırma parametreleri) ayırır. Genel olarak, uygulama ortama uyum sağlamalıdır, eğer bunu tam tersi şekilde yaparsanız, ortamın farklı uygulamaları veya tamamen ilgisiz, sisteme özgü gereksinimleri de karşılaması gerektiğinde sorunlarla karşılaşabilirsiniz.


8

Yetkilendirme ayarlarınızı bir Ortama koyabilirsiniz. Sevmek:

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>

Yetkilendirme çalışıyor, ancak ortamımın gerçekten çalışmasını sağlayamadım.


1
Sanırım sorun şudur: "Yalnızca önceki SetEnvIf [NoCase] ​​yönergeleri tarafından tanımlanan ortam değişkenleri bu şekilde test için kullanılabilir. 'Daha önce', daha geniş bir kapsamda (sunucu çapında gibi) veya daha önce mevcut direktifin kapsamı. " (burada bulunan: askapache.com/htaccess/setenvif.html ) Aynı kapsama sahip olduğunuz için, ortamınızı çalıştıramazsınız.
user470370

4
bunun neden çalışmadığı son derece iyi burada açıklanmıştır stackoverflow.com/questions/11073752/…
nico gawenda

Ama bu hala mutlak bir yol ( /Users/...) kullanıyor - ve soru şu soruyu soruyor: "göreli bir yol nasıl kullanılır?"?
sdaau

Evet. Ancak ortam başına birden çok mutlak yol kullanmak için birden çok APPLICATION_ENV ayarı kullanabilirsiniz.
digitaldonkey

5

.htpasswd, sunucunun mutlak kökünden tam mutlak yol gerektirir.

Lütfen echo ile dosyanın tam mutlak yolunu alın echo $_SERVER['DOCUMENT_ROOT'];.

burada temel auth .htaccess betiği çalışıyor.

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

Giriş yapmadan önce

görüntü açıklamasını buraya girin

Afetr Giriş

görüntü açıklamasını buraya girin


3

XAMPP'yi Windows ile kullanmaya çalışıyorsanız ve canlı bir sunucuda bir .htaccess dosyası kullanmak ve ayrıca bir XAMPP geliştirme makinesinde geliştirmek istiyorsanız, aşağıdakiler harika çalışıyor!


1) Yeni bir XAMPP yüklemesinden sonra Apache'nin bir hizmet olarak yüklendiğinden emin olun.

  • Bu, XAMPP Kontrol Panelini açıp Apache modülünün solundaki küçük kırmızı "X" e tıklayarak yapılır.
  • Daha sonra Apache'yi bir servis olarak kurmak isteyip istemediğinizi soracaktır.
  • Ardından yeşil bir onay işaretine dönmelidir.

2) Apache bir hizmet olarak kurulduğunda bayrak olarak yeni bir ortam değişkeni ekleyin.

  • Öncelikle Apache hizmetini XAMPP Kontrol Panelinden durdurun.
  • Ardından bir komut istemi açın. (DOS'u simüle eden küçük siyah pencereyi biliyorsunuz)
  • Tip -D "DEV" -k yapılandırma: "\ Program Files (x86) \ xampp \ apache \ bin \ httpd.exe C" .
  • Bu, daha sonra kullanabileceğiniz ortam değişkenlerine yeni bir DEV bayrağı ekleyecektir .

3) Apache'yi başlatın

  • XAMPP Kontrol Panelini yedekleyin ve Apache hizmetini başlatın.

4) .htaccess dosyanızı aşağıdaki bilgilerle oluşturun ...

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

Yukarıdaki komut dosyasını açıklamak için burada birkaç not var ...

  • AuthUserFile dosyam, kurulumuma ve kişisel tercihlerime bağlıdır.
  • Web sayfamın c: \ sandbox \ web \ konumunda bulunduğu yerel bir test geliştirici kutum var . Bu klasörün içinde .htpasswd parola dosyasını içeren betikler adında bir klasörüm var .
  • İlk giriş IfDefine DEV , bu örnek için kullanılır. DEV ayarlanmışsa (yukarıda yaptığımız şey, yalnızca kaba makinede) o zaman o girişi kullanacaktır.
  • Ve sırayla, eğer canlı sunucu kullanılıyorsa IfDefine! DEV kullanılacaktır.

5) Aşağıdaki bilgilerle parola dosyanızı (bu durumda .htpasswd olarak adlandırılır) oluşturun ...

kullanıcı: $ apr1 $ EPuSBcwO $ / KtqDUttQMNUa5lGXSOzk.

Dikkat edilmesi gereken birkaç nokta ...


Ama bu hala mutlak bir yol ( /home...) kullanıyor - ve soru şu soruyu soruyor: "göreli bir yol nasıl kullanılır?"?
sdaau

2

veya localhost üzerinde geliştirirseniz (sadece apache 2.4+ için):

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

1

Bunun eski bir soru olduğunu biliyorum, ancak aynı şeyi aradım ve muhtemelen hızlı, mobil bir çözüm arayan birçok kişi var. İşte sonunda bulduğum şey:

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

Ama bu yine de mutlak bir yol ( /var...) kullanıyor - ve soru şu soruyu soruyor: "göreli bir yol nasıl kullanılır?"?
sdaau

1
Evet, bu bir çözümdür çünkü Apache .htaccessdosyanın konumuna giden göreceli yolları desteklemez . Göreli bir yol kullanacak olsaydınız, bu ServerRoot.
ovi

1

Bir örnek alalım.

Uygulamanız bazı Linux sunucularında / var / www / myApp içinde bulunur

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

htpasswdApp : / var / www / myApp / htpasswdApp . ( .Htpasswd dosyası için herhangi bir adı kullanmakta özgürsünüz )

.Htaccess'te göreli yolu kullanmak için :

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

Ancak server_root dizinindeki dosyayı arayacaktır . Document_root'ta değil .

Dışarıda, uygulama / var / www / myApp konumunda olduğunda :

document_root isimli / var / www / myApp

server_root , / etc / apache2 // (bizim örneğimizde, linux sunucusunu kullandığımız için )

Bunu apache yapılandırma dosyanızda ( /etc/apache2/apache2.conf ) yeniden tanımlayabilirsiniz , ancak sanırım bu kötü bir fikir.

Dolayısıyla /var/www/myApp/.htaccess'inizde göreceli dosya yolunu kullanmak için server_root'unuzda parola dosyasını tanımlamalısınız .

Bunu aşağıdaki komutu kullanarak yapmayı tercih ederim:

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

Komutumu kopyalamakta, sembol yerine sabit bağlantı kullanmakta veya server_root'unuza bir dosya kopyalamakta özgürsünüz .


1
apache varsayılan olarak .ht * ile başlayan dosyalara erişimi engellediğinden, bunlar için rastgele adların kullanılması önerilmez.
cari
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.