จะใช้เส้นทางสัมพันธ์กับ AuthUserFile ใน htaccess ได้อย่างไร?


102

ฉันมี. htaccess ที่ใช้การตรวจสอบสิทธิ์พื้นฐาน ดูเหมือนว่าเส้นทางไปยังไฟล์. htpasswd จะไม่สัมพันธ์กับไฟล์ htaccess แต่เป็นการกำหนดค่าเซิร์ฟเวอร์แทน

ดังนั้นแม้ว่าฉันจะมีไฟล์. htaccess และ. htpasswd ในไดเร็กทอรีเดียวกัน แต่ก็ใช้ไม่ได้:

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

อย่างไรก็ตามมันจะได้ผลถ้าฉันเปลี่ยน AuthUserFile เพื่อใช้เส้นทางสัมบูรณ์:

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

แต่ฉันต้องการสิ่งที่เป็นมือถือมากกว่าเพราะฉันใช้สิ่งนี้กับหลาย ๆ ไซต์ในพื้นที่ต่างๆ ฉันค้นหาเว็บแล้วแต่ไม่ได้รับการแก้ไขใด ๆ เป็นไปได้หรือ%{DOCUMENT_ROOT}ไม่ที่จะใช้เส้นทางสัมพัทธ์หรือตัวแปรเช่น?

คำตอบ:


52

ไม่สามารถใช้พา ธ สัมพัทธ์สำหรับAuthUserFile :

File-path คือพา ธ ไปยังไฟล์ผู้ใช้ หากไม่ใช่ค่าสัมบูรณ์ (เช่นถ้าไม่ได้ขึ้นต้นด้วยเครื่องหมายทับ) จะถือว่าเป็นค่าที่สัมพันธ์กับServerRoot.

คุณต้องยอมรับและหลีกเลี่ยงข้อ จำกัด นั้น


เรากำลังใช้IfDefineร่วมกับพารามิเตอร์บรรทัดคำสั่ง apache2 :

.htaccess (เหมาะสำหรับทั้งระบบการพัฒนาและระบบถ่ายทอดสด):

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

การกำหนดค่าเซิร์ฟเวอร์การพัฒนา (Debian)

ต่อท้ายสิ่งต่อไปนี้/etc/apache2/envvars:

export APACHE_ARGUMENTS=-Ddevelopment

รีสตาร์ท apache ของคุณหลังจากนั้นคุณจะได้รับแจ้งรหัสผ่านก็ต่อเมื่อคุณไม่ได้อยู่บนเซิร์ฟเวอร์การพัฒนา

แน่นอนคุณสามารถเพิ่ม IfDefine อื่นสำหรับเซิร์ฟเวอร์การพัฒนาได้เพียงคัดลอกบล็อกและลบไฟล์!.


4
แต่ยังคงใช้เส้นทางสัมบูรณ์ ( /var/...) - และคำถามถามว่า: "วิธีใช้เส้นทางสัมพัทธ์"?
sdaau

1
จากนั้นคำถามได้รับการแก้ไขเพื่อให้ตอบได้อย่างถูกต้องด้วย "ไม่" :)
Erenor Paz

15

ในกรณีที่ผู้คนกำลังมองหาวิธีแก้ปัญหานี้:

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

1
สิ่งนี้จะดีมาก แต่ปลอดภัยหรือไม่ที่จะพึ่งพาreq('Host')ลูกค้าจะหลอกค่านี้ไม่ได้หรือ
Marco Demaio

1
@MarcoDemaio ใช่มันสามารถ / อาจถูกหลอกโดยใช้เช่นที่อยู่ IP ขึ้นอยู่กับการกำหนดค่าของคุณ ไม่ใช่ใช่หรือไม่ใช่แน่นอน มันขึ้นอยู่กับ.
Maxime

12

1) โปรดทราบว่าการมี.htpasswdไฟล์อยู่ด้านล่างรูทเซิร์ฟเวอร์ถือว่าไม่ปลอดภัย

2) เอกสารกล่าวเกี่ยวกับเส้นทางสัมพัทธ์ดังนั้นดูเหมือนว่าคุณจะโชคไม่ดี:

File-path คือพา ธ ไปยังไฟล์ผู้ใช้ ถ้ามันไม่ได้เป็นที่แน่นอน (กล่าวคือถ้ามันไม่ได้เริ่มต้นด้วยการเฉือน) ก็จะถือว่าเป็นเทียบกับServerRoot

3) ในขณะที่คำตอบที่แนะนำการใช้ตัวแปรสภาพแวดล้อมทำงานได้ดีอย่างสมบูรณ์ฉันต้องการใส่ตัวยึดตำแหน่งใน.htaccessไฟล์หรือมีเวอร์ชันที่แตกต่างกันในโค้ดเบสของฉันและตั้งค่ากระบวนการปรับใช้ทั้งหมด (เช่นแทนที่ตัวยึดตำแหน่งหรือเปลี่ยนชื่อ / ย้ายไฟล์ที่เหมาะสม)

ในโปรเจ็กต์ Java ฉันใช้ Maven เพื่อทำงานประเภทนี้กล่าวคือโปรเจ็กต์ PHP ฉันต้องการมีเชลล์สคริปต์ build.sh และ / หรือ install.sh ที่ปรับไฟล์ที่ปรับใช้ให้เข้ากับสภาพแวดล้อม สิ่งนี้จะแยกโค้ดเบสของคุณออกจากข้อมูลเฉพาะของสภาพแวดล้อมเป้าหมาย (เช่นตัวแปรสภาพแวดล้อมและพารามิเตอร์การกำหนดค่า) โดยทั่วไปแอปพลิเคชันควรปรับให้เข้ากับสภาพแวดล้อมหากคุณทำในทางกลับกันคุณอาจประสบปัญหาเมื่อสภาพแวดล้อมต้องรองรับแอปพลิเคชันที่แตกต่างกันหรือสำหรับข้อกำหนดเฉพาะของระบบที่ไม่เกี่ยวข้องกันโดยสิ้นเชิง


8

คุณสามารถตั้งค่าการตรวจสอบสิทธิ์ของคุณในสภาพแวดล้อม ชอบ:

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>

การตรวจสอบสิทธิ์ใช้งานได้ แต่ฉันไม่สามารถทำให้สภาพแวดล้อมของฉันทำงานได้จริง


1
ฉันคิดว่าปัญหาคือ: "เฉพาะตัวแปรสภาพแวดล้อมที่กำหนดโดยคำสั่ง SetEnvIf [NoCase] ​​ก่อนหน้าเท่านั้นที่พร้อมใช้งานสำหรับการทดสอบในลักษณะนี้ 'ก่อนหน้านี้' หมายความว่ามีการกำหนดไว้ในขอบเขตที่กว้างขึ้น (เช่นทั้งเซิร์ฟเวอร์) หรือก่อนหน้านี้ใน ขอบเขตของคำสั่งปัจจุบัน " (พบที่นี่: askapache.com/htaccess/setenvif.html ) เนื่องจากคุณมีขอบเขตเดียวกันคุณจึงไม่สามารถทำให้สภาพแวดล้อมของคุณทำงานได้
user470370

4
ทำไมถึงใช้งานไม่ได้อธิบายได้ดีเป็นพิเศษที่นี่stackoverflow.com/questions/11073752/…
nico gawenda

แต่ยังคงใช้เส้นทางสัมบูรณ์ ( /Users/...) - และคำถามถามว่า: "วิธีใช้เส้นทางสัมพัทธ์"?
sdaau

ใช่. แต่คุณสามารถใช้การตั้งค่า APPLICATION_ENV หลายรายการเพื่อใช้เส้นทางสัมบูรณ์หลายเส้นทางต่อสภาพแวดล้อม
digitaldonkey

5

.htpasswd ต้องการพา ธ สัมบูรณ์แบบเต็มจากรูทสัมบูรณ์ของเซิร์ฟเวอร์

echo $_SERVER['DOCUMENT_ROOT'];กรุณารับเส้นทางแน่นอนเต็มรูปแบบของไฟล์โดยสะท้อน

นี่คือการทำงานพื้นฐาน auth .htaccess script

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

ก่อนเข้าสู่ระบบ

ป้อนคำอธิบายภาพที่นี่

เข้าสู่ระบบ Afetr

ป้อนคำอธิบายภาพที่นี่


3

หากคุณกำลังพยายามใช้ XAMPP กับ Windows และต้องการใช้ไฟล์. htaccess บนเซิร์ฟเวอร์ที่ใช้งานจริงและพัฒนาบนเครื่องพัฒนา XAMPP สิ่งต่อไปนี้ใช้งานได้ดี


1) หลังจากติดตั้ง XAMPP ใหม่ตรวจสอบให้แน่ใจว่าได้ติดตั้ง Apache เป็นบริการ

  • ทำได้โดยการเปิดแผงควบคุม XAMPP และคลิกที่ "X" สีแดงเล็ก ๆ ทางด้านซ้ายของโมดูล Apache
  • จากนั้นจะถามคุณว่าคุณต้องการติดตั้ง Apache เป็นบริการหรือไม่
  • จากนั้นควรเปลี่ยนเป็นเครื่องหมายถูกสีเขียว

2) เมื่อติดตั้ง Apache เป็นบริการให้เพิ่มตัวแปรสภาพแวดล้อมใหม่เป็นแฟล็ก

  • ขั้นแรกให้หยุดบริการ Apache จากแผงควบคุม XAMPP
  • จากนั้นเปิดพรอมต์คำสั่ง (คุณรู้จักหน้าต่างสีดำเล็ก ๆ ที่จำลอง DOS)
  • พิมพ์"C: \ Program Files (x86) \ XAMPP \ Apache \ bin \ httpd.exe" -D "DEV" -k การตั้งค่า
  • สิ่งนี้จะผนวกแฟล็ก DEVใหม่เข้ากับตัวแปรสภาพแวดล้อมที่คุณสามารถใช้ได้ในภายหลัง

3) เริ่ม Apache

  • เปิดการสำรองข้อมูลแผงควบคุม XAMPP และเริ่มบริการ Apache

4) สร้างไฟล์. htaccess ของคุณด้วยข้อมูลต่อไปนี้ ...

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

เพื่ออธิบายสคริปต์ข้างต้นต่อไปนี้เป็นบันทึกย่อ ...

  • AuthUserFile ของฉันขึ้นอยู่กับการตั้งค่าและความชอบส่วนบุคคลของฉัน
  • ฉันมีกล่องทดสอบ dev ท้องถิ่นที่มีหน้าเว็บของฉันอยู่ที่C: \ Sandbox \ เว็บ \ ภายในโฟลเดอร์ฉันมีโฟลเดอร์ที่เรียกว่าสคริปต์ที่ประกอบด้วยแฟ้มรหัสผ่าน.htpasswd
  • รายการแรกIfDefine DEVถูกใช้สำหรับอินสแตนซ์นั้น หากตั้งค่า DEV (ซึ่งเป็นสิ่งที่เราทำไว้ข้างต้นเฉพาะบนเครื่อง dev ที่หยาบ) มันจะใช้รายการนั้น
  • และในทางกลับกันถ้าใช้เซิร์ฟเวอร์สดIfDefine! DEVจะถูกใช้

5) สร้างไฟล์รหัสผ่านของคุณ (ในกรณีนี้ชื่อ. htpasswd) ด้วยข้อมูลต่อไปนี้ ...

ผู้ใช้: $ apr1 $ EPuSBcwO $ / KtqDUttQMNUa5lGXSOzk

สิ่งที่ควรทราบ ...

  • ไฟล์รหัสผ่านของคุณสามารถเป็นชื่อใดก็ได้ที่คุณต้องการ
  • คุณควรใช้. htpasswd เพื่อความปลอดภัย
  • พบตัวสร้างรหัสผ่านที่ยอดเยี่ยม @ http://www.htaccesstools.com/htpasswd-generator/
  • คำอธิบายและเหตุผลที่ดีว่าทำไมคุณควรใช้ชื่อนี้สำหรับไฟล์ของคุณอยู่ที่ @ http://www.htaccesstools.com/articles/htpasswd/
  • ตรวจสอบให้แน่ใจว่าคุณใส่ไฟล์รหัสผ่านในตำแหน่งที่ถูกต้อง !!! (ดูขั้นตอนที่ 4 พื้นที่ AuthUserFile)

แต่ยังคงใช้เส้นทางสัมบูรณ์ ( /home...) - และคำถามถามว่า: "วิธีใช้เส้นทางสัมพัทธ์"?
sdaau

2

หรือหากคุณพัฒนาบน localhost (สำหรับ apache 2.4+ เท่านั้น):

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

1

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันเพิ่งค้นหาสิ่งเดียวกันและอาจมีคนอื่น ๆ ค้นหาวิธีแก้ปัญหาบนมือถือที่รวดเร็ว นี่คือสิ่งที่ฉันคิดในที่สุด:

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

แต่ยังคงใช้เส้นทางสัมบูรณ์ ( /var...) - และคำถามถามว่า: "วิธีใช้เส้นทางสัมพัทธ์"?
sdaau

1
ใช่มันเป็นวิธีแก้ปัญหาเนื่องจาก Apache ไม่รองรับพา ธ สัมพัทธ์ไปยังตำแหน่งของ.htaccessไฟล์ หากคุณต้องใช้เส้นทางสัมพัทธ์มันจะถือว่าสัมพันธ์กับServerRoot.
ovi

1

ลองมาเป็นตัวอย่าง

แอปพลิเคชันของคุณอยู่ใน/ var / www / myAppบนเซิร์ฟเวอร์ Linuxบางเครื่อง

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

htpasswdApp : / var / www / MyApp / htpasswdApp (คุณสามารถใช้ชื่อใดก็ได้สำหรับไฟล์. htpasswd )

ในการใช้เส้นทางสัมพัทธ์ใน. htaccess :

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

แต่จะค้นหาไฟล์ในไดเรกทอรีserver_root ไม่ได้อยู่ในdocument_root

ในกรณีที่แอปพลิเคชันอยู่ที่/ var / www / myApp :

document_rootคือ/ var / www / myApp

server_rootคือ/ etc / apache2 // (ในตัวอย่างของเราเนื่องจากเราใช้เซิร์ฟเวอร์ linux )

คุณสามารถกำหนดค่าใหม่ได้ในไฟล์คอนฟิกูเรชัน apache ( /etc/apache2/apache2.conf ) แต่ฉันคิดว่ามันเป็นความคิดที่ไม่ดี

เพื่อที่จะใช้เส้นทางของไฟล์ญาติในของคุณ/var/www/myApp/.htaccess คุณควรกำหนดรหัสผ่านไฟล์ในของคุณserver_root

ฉันชอบที่จะทำตามคำสั่ง:

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

คุณมีอิสระในการคัดลอกคำสั่งของฉันใช้การเชื่อมโยงอย่างหนักแทนสัญลักษณ์หรือคัดลอกไฟล์ที่คุณserver_root


1
เนื่องจาก apache บล็อกการเข้าถึงไฟล์ที่ขึ้นต้นด้วย. ht * โดยค่าเริ่มต้นจึงไม่แนะนำให้ใช้ชื่อสุ่มสำหรับไฟล์เหล่านี้
cari
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.