隐藏一次&对于处理登录的唯一文件 - wp-login.php

时间:2015-09-09 03:44:41

标签: php wordpress .htaccess redirect http-status-code-404

我已经试图解决这个问题好几个月了,我找到的每个解决方案都不能正常工作或者很容易通过。

规则:

  • 用户可以在前端登录,注册,使用丢失的密码等 - 得到了覆盖!
  • 每次直接访问wp-admin,admin,wp-login,登录都应显示404或重定向到主页

我尝试过的事情&失败(可能做错了)或想到尝试:

  • 复制粘贴&重命名wp-login.php,然后使用wp_loginwp_login_url在这个文件中进行所有这些操作 - 不确定其他WP功能是否需要" wp-login.php"正常工作

  • 为functions.php创建一个函数,检查"秘密字符串"被添加到URL的末尾,重定向其他人或显示404

  • 只是普通的重定向

  • 尝试了不同的插件

  • 阅读&尝试在线发现至少50个.htaccess代码(不是开玩笑)

我遇到的问题:

  • 普通重定向:无法登录或注销

  • 所有插件的工作方式:只隐藏wp-login.php,你仍然可以使用login,admin& wp-admin

  • 到目前为止
  • .htaccess结果:添加"链接"只重定向到wp-login.php,但无论如何都不能隐藏它,更改它或用新的"链接替换wp-login"在网址

几乎有效:

//Don't Let Users To Login Page
function example_simple_query_string_protection_for_login_page() {

   //Secret string
   $QS = '?secret=1';

   $theRequest = 'https://' . $_SERVER['SERVER_NAME'] . '/' . 'wp-login.php' . '?'. $_SERVER['QUERY_STRING'];

  if ( site_url('/wp-login.php').$QS == $theRequest ) {
      //Shows WP login page
  } 

  else {
      //Redirects to home page
      header( 'Location: https://' . $_SERVER['SERVER_NAME'] . '/' );

      //Shows 404 - Doesn't work as expected!!
      //include( get_query_template( '404' ) );
  }
}

 add_action('login_head', 'example_simple_query_string_protection_for_login_page');

问题:

  • 没有找到任何好的在线解决方案如何强迫"真实" 404!
  • 如果他/她转到wp-admin或admin,用户不会被重定向 - 相反,他/她会获得403 Forbidden errror和丑陋的WP限制访问屏幕!

我的代码可以解决这个问题,但由于某种原因无效:

//Disable wp-admin For Non-Admins If Not Running AJAX Or Updating User Data
function disable_wp_admin_for_non_admins() {
  if ( !current_user_can('manage_options') &&  $_SERVER['DOING_AJAX'] != '/wp-admin/admin-ajax.php' && !ajax_add_remove_favorites() && !ajax_update_user_profile_function() ) {
    wp_redirect( home_url() ); 
    exit;
  }
}
add_action('admin_init', 'disable_wp_admin_for_non_admins');

问题:只需要1个有效!

  • 复制粘贴重命名wp-login理论上是否可行或其他功能是否需要该名称?
  • 一劳永逸,你能实现我想要的东西.htaccess吗?
  • 如何让我的代码工作? (显示404并且不向登录的用户显示403)
  • 还有其他解决办法可行,但我不知道吗?

2 个答案:

答案 0 :(得分:1)

最近我不得不在另一个项目上抛出404错误。不确定包装它的最佳过滤器/操作,但我使用了parse_request

add_action('parse_request', 'prevent_wp_login_access');

function prevent_wp_login_access() 
{
    global $wp_query;

    //check to see if the page is wp-login.php
    //if so
    //force 404
    $wp_query->set_404();
    status_header(404);
    require TEMPLATEPATH.'/404.php';
    exit;
}

您还可以尝试将其包裹在init操作中,如果header()对象尚不可用,则抛出您自己的$wp_query

只是一个想法。

答案 1 :(得分:0)

我已经测试了以下内容,以防止访问wp-login.php。它也考虑了注销,所以不应该给你一个问题。不确定它是否能与WP的其他方面很好地配合。

add_action('init', 'prevent_wp_login_access');

function prevent_wp_login_access() 
{
    global $pagenow;

    if( isset($_GET['action']) && $_GET['action'] == 'logout' )
        return;

    if( 'wp-login.php' == $pagenow ) {
        wp_redirect( get_option('siteurl') );
        exit;
    }

}