我正在尝试在 .htaccess 中编写一条规则,将所有内容重定向/wp-admin
到/login
除非某个特定用户(WebAdministrator)正在登录。我该如何制定这样的规则?
如果我使用:
Rewriterule ^wp-admin /login [R=301,NC,L]
然后它就会破坏它,因为它会继续重定向到/login
,即使对于管理员来说也是如此,因为当管理员登录时,他们应该看到面板/wp-admin
答案1
您遇到了先有鸡还是先有蛋的问题。您不知道用户是否是管理员,直到他登录为止,因此您没有在登录前进行条件重定向的信息。
答案2
在 Apache 中有几种方法可以做到这一点,但没有一种是很好的。
最好的方法是在 wordpress 中执行此操作,或者构建一个小型 wordpress 插件以使用相关挂钩将所有 wp-login.php(登录页面位置)更改为自定义 /login:https://developer.wordpress.org/reference/hooks/login_url/
apache 重写能够知道某人是否登录的唯一方法是询问 wordpress 或直接读取 cookie。
对于前者,您需要使用 RewriteMap 的 PRG 模式从重写模块运行自定义脚本(https://httpd.apache.org/docs/current/rewrite/rewritemap.html#prg) 运行一个 PHP 脚本,查询 wordpress 的身份验证系统以查看他们是否已登录,并进行适当的重写。
您还可以使用基于 HTTP_COOKIE 变量的 RewriteCond 直接检查 cookie 值(请参阅https://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#RewriteCond)
然而,这两种方法都非常脆弱,我强烈建议在 WP 中进行。