2012-08-30 31 views
5

Tôi đang làm việc trên một trang Wordpress và các trang của tôi đang sử dụng cấu trúc liên kết cố định mô tả chúng giống như các thư mục. Đối với một vài trang, tôi muốn sử dụng Xác thực cơ bản để mật khẩu bảo vệ một vài trang. Làm thế nào tôi sẽ viết này trong tập tin htaccess của tôi? Tôi có đang bảo vệ tệp hoặc địa chỉ viết lại không?.htaccess, mod_rewrite và xác thực cơ bản

+0

Điều duy nhất gần như thành công là tôi đã tạo một thư mục có tên giống với URL thân thiện (ví dụ/friendlyurl /) và đặt một tệp .htaccess trong đó yêu cầu xác thực. Đi đến trang, tôi đã được yêu cầu cho các thông tin đăng nhập và sau đó được gửi đến một lỗi 403 Cấm. – Imaginary

Trả lời

7

Bạn sẽ không cần mod_rewrite cho điều này, hy vọng, điều này sẽ làm các trick:

SetEnvIfNoCase Request_URI ^/some/path/to/protect require_auth=true 
SetEnvIfNoCase Request_URI ^/another/protected/path require_auth=true 

# Auth stuff 
AuthUserFile /var/www/htpasswd 
AuthName "Password Protected" 
AuthType Basic 

# Setup a deny/allow 
Order Deny,Allow 
# Deny from everyone 
Deny from all 
# except if either of these are satisfied 
Satisfy any 
# 1. a valid authenticated user 
Require valid-user 
# or 2. the "require_auth" var is NOT set 
Allow from env=!require_auth 

Các mod_auth và các module mod_env nên có precidence qua mod_rewrite, vì vậy cấu trúc thư mục giả của bạn nên giữ nguyên . Bạn chỉ cần điền một số SetEnvIfNoCase Request_URI ^/some/path/to/protect require_auth=true cho mỗi cái, sau đó điền vào phần còn lại của công cụ xác thực để phù hợp với nhu cầu của bạn.

+0

Vâng, tôi không hoàn toàn hiểu tại sao điều đó lại xảy ra, nhưng ... điều đó đã xảy ra! Cảm ơn bạn rất nhiều! Tôi đã đổ mồ hôi trong nửa ngày! – Imaginary

+0

@Imaginary Về cơ bản, nếu biến môi trường 'require_auth' là * not * set, không cần xác thực. Chỉ thị 'SetEnvIfNoCase' ở trên cùng đặt biến đó nếu yêu cầu là cho các thư mục nhất định (cho dù chúng tồn tại hay không). –

+0

Tôi nghĩ rằng tôi đã có nó! Rất rõ ràng. Cảm ơn một lần nữa! – Imaginary

0

Vấn đề duy nhất tôi có với giải pháp này là việc nhấp vào nút hủy sẽ hiển thị trang được bảo vệ. Tôi đã cố gắng giải quyết vấn đề này bằng cách sử dụng:

RewriteCond %{REMOTE_USER} !user 
RewriteRule ^/protected-page /unauthenticated-page [R=401] 

Nhưng điều đó không hiệu quả. Tôi cung không chăc tại sao.

Để giải quyết vấn đề nhanh chóng và dơ bẩn tôi đã thêm

ErrorDocument 401 "You don't have access." 

Để tạo một chuyển hướng tôi đã sử dụng này

ErrorDocument 401 '<html><head><meta http-equiv="refresh" content="0; url=/unauthenticated-page" /></head><body></body></html>' 
0

Đối với những người đến đây với cùng một vấn đề như tôi, với .htaccess như thế này

AuthType Basic 
AuthName "some_name" 
AuthUserFile "/path/to/password/passwd" 
require valid-user 
<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase/
    RewriteRule ^index\.php$ - [L] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule . /index.php [L] 
</IfModule> 

quy tắc trên không hoạt động như tôi dự kiến ​​(ủy quyền, sau đó viết lại)

vì chỉ sáp nhập trật tự ("Nếu" được sáp nhập cuối cùng)

nhờ comment from Alek đến điểm đó ra

vì vậy khi tôi loại bỏ dấu ngoặc IfModule, các quy tắc đã bắt đầu làm việc cho tôi.

Các vấn đề liên quan