【问题标题】:.htaccess, mod_rewrite, and basic authentication.htaccess、mod_rewrite 和基本身份验证
【发布时间】:2012-08-25 14:25:52
【问题描述】:

我在一个 Wordpress 网站上工作,我的页面正在使用一个永久链接结构,该结构将它们 mod_rewrites 以使其看起来像目录。对于一些页面,我想使用基本身份验证来密码保护一些页面。我将如何在我的 .htaccess 文件中写这个?我是在保护文件,还是重写的地址?

【问题讨论】:

  • 唯一接近成功的是,我创建了一个与友好 URL 同名的目录(即 /friendlyurl/),并在其中放置了一个 .htaccess 文件请求身份验证。转到该页面,我被要求提供凭据,然后发送到 403 Forbidden 错误。

标签: wordpress .htaccess mod-rewrite basic-authentication


【解决方案1】:

你不需要 mod_rewrite ,希望这样可以解决问题:

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

mod_auth 和 mod_env 模块应该优先于 mod_rewrite,所以你的假目录结构应该保持不变。您只需为每个人填写一个SetEnvIfNoCase Request_URI ^/some/path/to/protect require_auth=true,然后填写其余的身份验证信息以满足您的需求。

【讨论】:

  • 好吧,我不完全明白为什么会这样,但是……确实如此!太感谢了!这半天我都汗流浃背了!
  • @Imaginary 本质上,如果require_auth 环境变量设置,则不需要进行身份验证。如果请求是针对某些目录(无论它们是否存在),顶部的 SetEnvIfNoCase 指令会设置该变量。
【解决方案2】:

我对此解决方案的唯一问题是单击取消按钮将显示受保护的页面。我试图通过使用来解决这个问题:

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

但这没有用。我不知道为什么。

为了快速解决问题,我添加了

ErrorDocument 401 "You don't have access."

为了创建重定向,我使用了这个

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

【讨论】:

  • 这个肮脏的伎俩奏效了,Cpanel 上周让我头疼...
【解决方案3】:

对于那些和我有同样问题的人来说,像这样使用 .htaccess

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>

上面的规则没有像我预期的那样工作(授权,然后重写)

因为指令合并顺序(“如果”最后合并)

感谢comment from Alek 指出这一点

所以当我删除 IfModule 括号时,规则已经开始为我工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2021-07-29
    • 2021-01-28
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多