ログイン画面からパスワードリセット時の再設定URLが404
-
ログインURLを変更した状態で、ログイン画面からパスワードリセットを行った際、届くメールに記載されているURLがwp-login.phpのままになっており、クリックしても404になります。
wp-login.phpの部分を変更すれば404にはなりません。
パスワードリセットのリンクを、XO securityで変更したURLにすることは可能でしょうか?
-
パスワードリセットのリンクは、
/wp-login.php?login=admin&key=xxxxx&action=rpというURLになりますが、if文の
preg_match( '#/wp-login\.php\?action=\w+#', $formated_path )にマッチしないので、URLの置き換えが行われず、そのまま出力されているようです。public function site_url( $url, $path, $scheme, $blog_id ) {
if ( isset( $this->options['login_page_name'] ) ) {
$loginfile = $this->options['login_page_name'] . '.php';
$formated_path = '/' . ltrim( $path, '/' );
if ( '/wp-login.php' === $formated_path || preg_match( '#/wp-login\.php\?action=\w+#', $formated_path ) ) {
$url = $this->get_login_url( $url, $loginfile );
} elseif ( is_multisite() && ! is_subdomain_install() ) {
$blog = get_site( $blog_id );
if ( $blog->path . 'wp-login.php' === $formated_path || preg_match( '#' . $blog->path . 'wp-login\.php\?action=\w+#', $formated_path ) ) {
$url = $this->get_login_url( $url, $loginfile );
}
}
}
return $url;
}I updated the piece of code in question to the code below, it now works.
public function site_url( $url, $path, $scheme, $blog_id ) {
if ( isset( $this->options['login_page_name'] ) ) {
$loginfile = $this->options['login_page_name'] . '.php';
$formated_path = '/' . ltrim( $path, '/' );
$pattern = '#/wp-login\.php(\?action=\w+(&key=[^&]+&login=[^&]+)?)?#';
if ( '/wp-login.php' === $formated_path || preg_match( $pattern, $formated_path ) ) {
$url = $this->get_login_url( $url, $loginfile );
} elseif ( is_multisite() && ! is_subdomain_install() ) {
$blog = get_site( $blog_id );
$multisite_pattern = '#' . preg_quote( $blog->path, '#' ) . 'wp-login\.php(\?action=\w+(&key=[^&]+&login=[^&]+)?)?#';
if ( $blog->path . 'wp-login.php' === $formated_path || preg_match( $multisite_pattern, $formated_path ) ) {
$url = $this->get_login_url( $url, $loginfile );
}
}
}
return $url;
}こちらコードの正規表現の不具合だと思っていますが、最新バージョン3.10.5でも修正されていないようです。
?action=だけでなく、&action=にもマッチするように対応して頂けないでしょうか?ご指摘の通り(@windorzさん、@sjonvugt さんありがとうございます)正規表現が間違えていました。
修正したバージョン3.10.6をリリースしましたので、アップデートして試してみてください。
返信が遅くなり申し訳ありませんでした(見落としてました💦)
修正ありがとうございます。
正規表現を見ると、相変わらず?action前提となっているようでした。残念ながら、&actionとなるときはログインURLの置換は処理されずにwp-login.phpメールに記載されたままでした。
元のコードがwp-login.php単独の場合と、actionパラメータがある場合の2つを対象にしているようですので、正規表現を使わずにstroposなどで文字列検出した方がシンプルな感じがします。
元のコードを以下のように修正すると、問題なく動作します。
public function site_url( $url, $path, $scheme, $blog_id ) {
if ( isset( $this->options['login_page_name'] ) ) {
$loginfile = $this->options['login_page_name'] . '.php';
$formated_path = '/' . ltrim( $path, '/' );
// シンプルな正規表現で ?action と &action の両方にマッチ
$pattern = '#/wp-login\.php.*(\?|&)action=\w+#';
if ( '/wp-login.php' === $formated_path || preg_match( $pattern, $formated_path ) ) {
$url = $this->get_login_url( $url, $loginfile );
} elseif ( is_multisite() && ! is_subdomain_install() ) {
$blog = get_site( $blog_id );
$multisite_pattern = '#' . preg_quote( $blog->path, '#' ) . 'wp-login\.php.*(\?|&)action=\w+#';
if ( $blog->path . 'wp-login.php' === $formated_path || preg_match( $multisite_pattern, $formated_path ) ) {
$url = $this->get_login_url( $url, $loginfile );
}
}
}
return $url;
}すみません💦修正したバージョン3.10.7をリリースしましたので試してみてください。
修正頂きありがとうございました。
問題なく動作することを確認できました。
素晴らしいプラグインをリリースして頂き感謝いたします。
You must be logged in to reply to this topic.