Làm cách nào để sử dụng đường dẫn LIÊN QUAN với AuthUserFile trong htaccess?


98

Tôi có .htaccess sử dụng xác thực cơ bản. Có vẻ như đường dẫn đến tệp .htpasswd không liên quan đến tệp htaccess mà thay vào đó là cấu hình máy chủ.

Vì vậy, mặc dù tôi có các tệp .htaccess và .htpasswd trong cùng một thư mục, điều này không hoạt động:

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

Tuy nhiên, nó hoạt động nếu tôi thay đổi AuthUserFile để sử dụng đường dẫn tuyệt đối:

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

Nhưng tôi muốn thứ gì đó di động hơn vì tôi sử dụng nó trên nhiều trang web ở các khu vực khác nhau. Tôi đã tìm kiếm trên web nhưng không có bất kỳ giải pháp nào. Có thể sử dụng đường dẫn tương đối hoặc các biến như thế %{DOCUMENT_ROOT}nào không?

Câu trả lời:


51

Không thể sử dụng đường dẫn tương đối cho AuthUserFile :

File-path là đường dẫn đến tệp người dùng. Nếu nó không phải là tuyệt đối (tức là, nếu nó không bắt đầu bằng dấu gạch chéo), nó được coi là tương đối với ServerRoot.

Bạn phải chấp nhận và khắc phục hạn chế đó.


Chúng tôi đang sử dụng IfDefinecùng với tham số dòng lệnh apache2 :

.htaccess (thích hợp cho cả hệ thống phát triển và hệ thống trực tiếp):

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

Cấu hình máy chủ phát triển (Debian)

Nối phần sau vào /etc/apache2/envvars:

export APACHE_ARGUMENTS=-Ddevelopment

Khởi động lại apache của bạn sau đó và bạn sẽ chỉ nhận được lời nhắc mật khẩu khi bạn không ở trên máy chủ phát triển.

Tất nhiên, bạn có thể thêm IfDefine khác cho máy chủ phát triển, chỉ cần sao chép khối và xóa !.


4
Nhưng điều này vẫn sử dụng một đường dẫn tuyệt đối ( /var/...) - và câu hỏi đặt ra: "làm thế nào để sử dụng một đường dẫn tương đối"?
sdaau

1
Và sau đó là câu hỏi đã được chỉnh sửa để đúng cách trả lời với một "không" :)
Erenor Paz

15

Để đề phòng trường hợp mọi người đang tìm kiếm giải pháp cho điều này:

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

1
Điều này sẽ rất tuyệt, nhưng liệu có an toàn để dựa vào req('Host'), khách hàng không thể lừa giá trị này?
Marco Demaio

1
@MarcoDemaio Có, nó có thể / có thể bị lừa bằng cách sử dụng, ví dụ, địa chỉ IP. Nó phụ thuộc vào cấu hình của bạn. Nó không phải là có hay không tuyệt đối. Nó phụ thuộc.
Maxime

12

1) Lưu ý rằng .htpasswdtệp bên dưới máy chủ gốc được coi là không an toàn .

2) Các tài liệu nói điều này về các con đường tương đối, vì vậy có vẻ như bạn không gặp may:

File-path là đường dẫn đến tệp người dùng. Nếu nó không phải là tuyệt đối (tức là nếu nó không bắt đầu bằng dấu gạch chéo), nó được coi là tương đối với ServerRoot .

3) Mặc dù các câu trả lời khuyến nghị việc sử dụng các biến môi trường hoạt động hoàn toàn tốt, nhưng tôi muốn đặt trình giữ chỗ trong .htaccesstệp hoặc có các phiên bản khác nhau trong cơ sở mã của mình và để quá trình triển khai thiết lập tất cả (tức là thay thế trình giữ chỗ hoặc đổi tên / di chuyển tệp thích hợp).

Trên các dự án Java, tôi sử dụng Maven để thực hiện loại công việc này, chẳng hạn như các dự án PHP, tôi muốn có tập lệnh shell build.sh và / hoặc install.sh để điều chỉnh các tệp được triển khai theo môi trường của chúng. Điều này tách cơ sở mã của bạn khỏi các chi tiết cụ thể của môi trường đích của nó (tức là các biến môi trường và thông số cấu hình của nó). Nói chung, ứng dụng phải thích ứng với môi trường, nếu bạn làm theo cách khác, bạn có thể gặp sự cố khi môi trường cũng phải phục vụ cho các ứng dụng khác nhau hoặc cho các yêu cầu hoàn toàn không liên quan đến hệ thống.


8

bạn có thể đặt cài đặt Auth của mình vào Môi trường. Giống:

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 đang hoạt động, nhưng tôi không thể làm cho môi trường của mình thực sự hoạt động.


1
Tôi nghĩ vấn đề là thế này: "Chỉ những biến môi trường được xác định bởi lệnh SetEnvIf [NoCase] ​​trước đó mới có sẵn để thử nghiệm theo cách này. 'Trước đó' có nghĩa là chúng đã được xác định ở phạm vi rộng hơn (chẳng hạn như toàn máy chủ) hoặc trước đó trong phạm vi của chỉ thị hiện tại. " (tìm thấy ở đây: askapache.com/htaccess/setenvif.html ) Vì bạn có cùng phạm vi, bạn không thể chạy môi trường của mình.
user470370

4
tại sao điều này không hoạt động là đặc biệt tốt giải thích ở đây stackoverflow.com/questions/11073752/...
nico gawenda

Nhưng điều này vẫn sử dụng một đường dẫn tuyệt đối ( /Users/...) - và câu hỏi đặt ra: "làm thế nào để sử dụng một đường dẫn tương đối"?
sdaau

Đúng. Nhưng bạn có thể sử dụng nhiều cài đặt APPLICATION_ENV để sử dụng nhiều đường dẫn tuyệt đối cho mỗi môi trường.
digitaldonkey

5

.htpasswd yêu cầu đường dẫn tuyệt đối đầy đủ từ gốc tuyệt đối của máy chủ.

Vui lòng lấy đường dẫn tuyệt đối đầy đủ của tệp bằng echo echo $_SERVER['DOCUMENT_ROOT'];.

đây là tập lệnh .htaccess auth cơ bản.

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

Trước khi đăng nhập

nhập mô tả hình ảnh ở đây

Đăng nhập Afetr

nhập mô tả hình ảnh ở đây


3

Nếu bạn đang cố gắng sử dụng XAMPP với Windows và muốn sử dụng tệp .htaccess trên máy chủ trực tiếp và cũng phát triển trên máy phát triển XAMPP thì cách sau hoạt động rất tốt!


1) Sau khi cài đặt mới XAMPP, hãy đảm bảo rằng Apache được cài đặt dưới dạng một dịch vụ.

  • Điều này được thực hiện bằng cách mở Bảng điều khiển XAMPP và nhấp vào dấu "X" nhỏ màu đỏ ở bên trái của mô-đun Apache.
  • Sau đó, nó sẽ hỏi bạn có muốn cài đặt Apache như một dịch vụ hay không.
  • Sau đó, nó sẽ chuyển sang một dấu kiểm màu xanh lá cây.

2) Khi Apache được cài đặt như một dịch vụ, hãy thêm một biến môi trường mới làm cờ.

  • Đầu tiên hãy dừng dịch vụ Apache từ Bảng điều khiển XAMPP.
  • Tiếp theo, mở một dấu nhắc lệnh. (Bạn biết cửa sổ nhỏ màu đen mô phỏng DOS)
  • Nhập "C: \ Program Files (x86) \ xampp \ apache \ bin \ httpd.exe" -D "DEV" -k config .
  • Thao tác này sẽ gắn cờ DEV mới vào các biến môi trường mà bạn có thể sử dụng sau này.

3) Khởi động Apache

  • Mở sao lưu Bảng điều khiển XAMPP và khởi động dịch vụ Apache.

4) Tạo tệp .htaccess của bạn với thông tin sau ...

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

Để giải thích script trên đây là một số lưu ý ...

  • AuthUserFile của tôi dựa trên thiết lập và sở thích cá nhân của tôi.
  • Tôi có một hộp dành cho nhà phát triển thử nghiệm cục bộ có trang web của tôi được đặt tại c: \ sandbox \ web \ . Bên trong thư mục đó, tôi có một thư mục được gọi là script chứa tệp mật khẩu .htpasswd .
  • Mục nhập đầu tiên IfDefine DEV được sử dụng cho trường hợp đó. Nếu DEV được đặt (đó là những gì chúng tôi đã làm ở trên, chỉ trên máy phát triển thô) thì nó sẽ sử dụng mục nhập đó.
  • Và lần lượt nếu sử dụng máy chủ trực tiếp IfDefine! DEV sẽ được sử dụng.

5) Tạo tệp mật khẩu của bạn (trong trường hợp này là .htpasswd) với thông tin sau ...

người dùng: $ apr1 $ EPuSBcwO $ / KtqDUttQMNUa5lGXSOzk.

Một số điều cần lưu ý ...

  • Tệp mật khẩu của bạn có thể là bất kỳ tên nào bạn muốn.
  • Bạn nên sử dụng .htpasswd để bảo mật.
  • Một trình tạo mật khẩu tuyệt vời được tìm thấy @ http://www.htaccesstools.com/htpasswd-generator/
  • Giải thích tuyệt vời và lý do tại sao bạn nên sử dụng tên đó cho tệp của mình nằm ở địa chỉ @ http://www.htaccesstools.com/articles/htpasswd/
  • ĐẢM BẢO BẠN ĐÃ ĐẶT TẬP TIN MẬT KHẨU Ở ĐÚNG VỊ TRÍ !!! (Xem vùng AuthUserFile bước 4)

Nhưng điều này vẫn sử dụng một đường dẫn tuyệt đối ( /home...) - và câu hỏi đặt ra: "làm thế nào để sử dụng một đường dẫn tương đối"?
sdaau

2

hoặc nếu bạn phát triển trên localhost (chỉ dành cho apache 2.4+):

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

1

Tôi biết đây là một câu hỏi cũ, nhưng tôi chỉ tìm kiếm điều tương tự và có lẽ có nhiều người khác đang tìm kiếm một giải pháp di động, nhanh chóng. Đây là những gì cuối cùng tôi nghĩ ra:

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

Nhưng điều này vẫn sử dụng một đường dẫn tuyệt đối ( /var...) - và câu hỏi đặt ra: "làm thế nào để sử dụng một đường dẫn tương đối"?
sdaau

1
Có, đó là một công việc xung quanh, vì Apache không hỗ trợ các đường dẫn tương đối đến vị trí của .htaccesstệp. Nếu bạn đang sử dụng một đường dẫn tương đối, nó sẽ được coi là tương đối với ServerRoot.
ovi

1

Hãy lấy một ví dụ.

Ứng dụng của bạn nằm trong / var / www / myApp trên một số máy chủ Linux

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

htpasswdApp : / var / www / myApp / htpasswdApp . (Bạn có thể tự do sử dụng bất kỳ tên nào cho .htpasswd tệp )

Để sử dụng đường dẫn tương đối trong .htaccess :

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

Nhưng nó sẽ tìm kiếm tệp trong thư mục server_root . Không có trong document_root .

Trong trường hợp ngoại lệ, khi ứng dụng được đặt tại / var / www / myApp :

document_root/ var / www / myApp

server_root/ etc / apache2 // (chỉ trong ví dụ của chúng tôi, vì chúng tôi sử dụng máy chủ linux )

Bạn có thể xác định lại nó trong tệp cấu hình apache của mình ( /etc/apache2/apache2.conf ), nhưng tôi đoán đó là một ý tưởng tồi.

Vì vậy, để sử dụng đường dẫn tệp tương đối trong /var/www/myApp/.htaccess, bạn nên xác định tệp của mật khẩu trong server_root của bạn .

Tôi thích làm điều đó bằng lệnh sau:

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

Bạn có thể tự do sao chép lệnh của tôi, sử dụng liên kết cứng thay vì ký hiệu hoặc sao chép tệp vào server_root của bạn .


1
vì apache chặn quyền truy cập vào các tệp bắt đầu bằng .ht * theo mặc định, bạn không nên sử dụng các tên ngẫu nhiên cho chúng.
cari
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.