自定义WordPress登录URL

时间:2017-05-02 作者:user137786

我想更改WordPress的默认登录URL,即。www.website.com/wp-admin 这是一种风俗习惯,游客很难尝试进入。

4 个回复
SO网友:Aishan

您可以根据自己的需要将后端URL更改为自定义。您可以使用插件实现这一点iThemes Security.

SO网友:Tarun modi

您好,请使用以下不带插件的代码:

在wp config中添加以下代码。php

define(\'WP_ADMIN_DIR\', \'private-area\');  
define( \'ADMIN_COOKIE_PATH\', SITECOOKIEPATH . WP_ADMIN_DIR);  
在主题函数中添加以下代码。php

add_filter(\'site_url\',  \'change_wpadmin_url\', 10, 3);  
function change_wpadmin_url( $url, $path, $orig_scheme ) {  
    $old  = array( "/(wp-admin)/");  
    $admin_dir = WP_ADMIN_DIR;  
    $new  = array($admin_dir);  
    return preg_replace( $old, $new, $url, 1);  
}
将下面的行添加到。htaccess文件

RewriteRule ^private-area/(.*) wp-admin/$1?%{QUERY_STRING} [L]

SO网友:Alex Having Fun

你可以试试这个代码,它对我有用。

每当访问默认的/wp admin或/wp登录时,此代码将重定向到主页。您可以将密码设置为登录URL,并且仅允许通过此URL访问wp admin和wp login:https://www.yourdomain.com/?you-set-your-passcode

将此代码添加到functions.php 你的主题。

// define and set passcode that serves as login url.
define(\'PASSCODE\',\'make-you-own-passcode\');

function mask_login_url(){
// redirect to login page when passcode is verified
if( !is_user_logged_in() && parse_url($_SERVER[\'REQUEST_URI\'], PHP_URL_QUERY) == PASSCODE ){
    wp_safe_redirect( home_url(\'wp-login.php?\'. PASSCODE .\'&redirect=false\') );
    exit();
}
// redirect to dashboard if user has already logged in
if( is_user_logged_in() && parse_url($_SERVER[\'REQUEST_URI\'], PHP_URL_QUERY) == PASSCODE ){
    wp_safe_redirect( home_url("wp-admin") );
    exit();
} } 
add_action( \'init\', \'mask_login_url\');

function mask_login_redirects(){
if( isset($_POST[\'passcode\']) && $_POST[\'passcode\'] == PASSCODE) return false;

// redirects to dashboard when /wp-admin is accessed and user is logged in
if ( (is_user_logged_in()) && (strpos($_SERVER[\'REQUEST_URI\'], \'wp-admin\') !== false)) {
    wp_safe_redirect( home_url("wp-admin"), 302 );
    exit();
}
// redirects to homepage when /wp-admin or /wp-login is accessed and user is not logged in
if ( (!is_user_logged_in()) && ((strpos($_SERVER[\'REQUEST_URI\'], \'wp-admin\') !== false) || (strpos($_SERVER[\'REQUEST_URI\'], \'wp-login\') !== false)) && ( strpos($_SERVER[\'REQUEST_URI\'], PASSCODE) === false ) ) {
    wp_safe_redirect( home_url(), 302 );
    exit();
}
// redirect to homepage after logout
if( strpos($_SERVER[\'REQUEST_URI\'], \'action=logout\') !== false ){
    check_admin_referer( \'log-out\' );
    wp_logout();
    wp_safe_redirect( home_url(\'?logged-out\'), 302 );
    exit();
} }
add_action( \'login_init\', \'mask_login_redirects\', 1); 

// Add a passcode hidden field to login form
function custom_login_hidden_field(){
echo \'<input type="hidden" name="passcode" value="\'. PASSCODE .\'" />\';
}
add_action(\'login_form\', \'custom_login_hidden_field\');

SO网友:David Wolf

理论上,您可以做的是,只允许访问wp-login.php, 当特殊令牌可用且验证为true时,否则您将die 在状态代码为的页面上403404 (你喜欢什么都行)。

要生成令牌,您可以在站点上设置另一个秘密路由,在此处生成令牌,并将该信息重定向到wp-login.php.

要使这一概念发挥作用,您需要做的是:

向注册自定义路由add_rewrite_rule()query_vars 过滤器设置回调,该回调检查查询变量,并最终使用生成令牌和重定向wp_redirect()wp-login.php 要检查令牌是否存在,它是否有效,是否存在,请显示登录页面,否则die (此外,您必须确保当前页面是登录页面,因为没有直接挂钩)

    令牌您的令牌可以是固定的,也可以是动态的,并在每个页面视图上刷新自身(当然更安全)。

    要生成令牌,可以使用WordPresswp_create_nonce()wp_verify_nonce() 功能。

    将代币从您的路线传递到wp-login.php 页面在重定向过程中,可以使用以下方法之一:

    例如,将令牌作为GET参数附加Authorization

  1. 将令牌附加为HTTP cookie,将其存储为数据库中的WordPress transient,存储在PHP会话中,应首选某些列出的选项,例如,在WordPress中使用PHP会话可能不是最高的安全标准:https://techgirlkb.guru/2017/08/wordpress-doesnt-use-php-sessions-neither/

    代码示例在这个示例中,我对使用WordPress nonces生成令牌和使用附加令牌作为GET参数的重定向的组合进行了编码。

    <?php
    
    declare(strict_types=1);
    
    use Devidw\\WordPress\\Helper\\Helper;
    
    class HardenLogin
    {
        /**
         * Constructor.
         */
        public function __construct()
        {
            add_action(
                hook_name: \'init\',
                callback: [$this, \'addCustomLoginPageUrl\'],
            );
    
            add_filter(
                hook_name: \'query_vars\',
                callback: [$this, \'addCustomLoginPageUrlQueryVar\'],
            );
    
            add_action(
                hook_name: \'template_redirect\',
                callback: [$this, \'addCustomLoginPageRoute\'],
            );
    
            add_action(
                hook_name: \'init\',
                callback: [$this, \'replaceDefaultLoginPage\'],
                priority: PHP_INT_MAX,
            );
        }
    
        /**
         * Get the custom login page slug.
         */
        public function getCustomLoginPageSlug(): string
        {
            return \'my-super-secret-login-page\';
        }
    
        /**
         * Add custom login page route.
         */
        public function addCustomLoginPageUrl(): void
        {
            add_rewrite_rule(
                regex: \'^\' . $this->getCustomLoginPageSlug() . \'/?$\',
                query: \'index.php?my_hard_login=1\',
                after: \'top\',
            );
        }
    
        /**
         * Add custom login page query var.
         */
        function addCustomLoginPageUrlQueryVar(array $vars): array
        {
            $vars[] = \'my_hard_login\';
            return $vars;
        }
    
        /**
         * Add a custom login page.
         */
        public function addCustomLoginPageRoute(): void
        {
            if (get_query_var(\'my_hard_login\', false) === false) {
                return;
            }
    
            wp_redirect(
                location: add_query_arg(
                    \'my_hard_login_nonce\',
                    wp_create_nonce(\'my_hard_login_nonce\'),
                    wp_login_url(),
                ),
            );
    
            die;
        }
    
        /**
         * Replace the default login page.
         */
        public function replaceDefaultLoginPage(): void
        {
            if (
                !Helper::isLoginPage() or
                !empty($_GET[\'action\']) and $_GET[\'action\'] === \'logout\' and !empty($_GET[\'_wpnonce\']) and wp_verify_nonce($_GET[\'_wpnonce\'], \'log-out\') === 1 or
                !empty($_GET[\'dw_hard_login_nonce\']) and wp_verify_nonce($_GET[\'dw_hard_login_nonce\'], \'dw_hard_login_nonce\') === 1
            ) {
                return;
            }
    
            header(\'HTTP/1.0 404 Not Found\');
    
            @include_once get_query_template(\'404\');
    
            die;
        }
    }
    
    要确定我们是否在登录页面上,您可以查看以下答案:https://wordpress.stackexchange.com/a/237285/218274.

    基本上是什么Helper::isLoginPage() 正在执行:https://github.com/devidw/wp-helper/blob/ff2e15eb4514d6728993442ab22bba2f6659a2f5/src/Helper.php#L69-L81

    编辑要使事情正常进行,我们实际上必须扩展最后一种方法,通过过滤登录URL,WordPress将其放置在登录表单中,因为我们的逻辑会阻止登录。

    /**
     * When we are on the login page, we have to add the nonce, to the form[action*="wp-login.php"].
     */
    if (Helper::isLoginPage()) {
        add_filter(
            hook_name: \'site_url\',
            callback: [$this, \'filterLoginUrl\'],
        );
    }
    
    以及:

    /**
     * Filter login URL.
     */
    public function filterLoginUrl(string $url): string
    {
        return add_query_arg(
            \'my_hard_login_nonce\',
            wp_create_nonce(\'my_hard_login_nonce\'),
            $url,
        );
    }
    

相关推荐