Ktai Style 作者です。
「Wordpress Password」は、
http://broome.us/archives/2007/01/31/the-wordpress-password-plugin/
で配布されているものでしょうか? WordPress のプラグインは、しばしば似た機能で同名の名称だったりするので、必ず配布元を明記して頂くようお願いします。
window. location="/blog/wp-content/plugins/wp-password/login.php?err=&destination=/blog/";An automatic redirect has failed. Youshould have been redirected to this site.
というのは、JavaScript のソースが見えていると思われます。多くの携帯電話は JavaScript に未対応で、機種によってはソースコードがそのまま見えてしまうことがあります (特にドコモ)。
また、入力したパスワードの維持はクッキーを使っています。しかし、ドコモ携帯はクッキー未対応のため、パスワードが消えてしまい、ログインできないです。クッキーに対応している、au, ソフトバンク 3G, ウィルコム、イー・モバイル、各社スマートフォンならば、ログインはできるかもしれません。
単純に言えば、Wordpress Password はドコモ未対応ということです。対応させるには、Wordpress Password 側でクッキーを使わないでログイン状態を維持する仕組みを作らなければならず、相当困難です。プラグインの作りが悪いというより、ドコモが悪いと言えるでしょう (WordPress Password の作りも、ちょっと変なところが無きにしもあらずですが)。
最初は.htaccessを使用して閲覧制限をかけようと思っていたのですが、そうすると記事投稿の際の画像アップロードが上手くいかなくなってしまった為
Basic 認証を使おうとされたわけですね。
wp-admin 配下を認証の対象外とすればよさそうなのですが、.htaccess では設定がちょっと難しいと思います。他には、登録ユーザーだけ内容を見せるプラグインなどもあったりしますが、これも携帯閲覧とは相性が悪いです。
やるとすれば、テーマを表示させるとき (WP_USE_THEMES が定義ずみのとき)、PHP 側で Basic 認証を要求させるようにする手があります。以下のコードを my-hacks.php というファイルに書いて、サーバーの WordPress インストールディレクトリーに転送し、管理パネルの「その他の設定」で my-hacks.php を有効にしてみてください。
パスワードは「your_password」の部分に直書きなので、あまり安全ではありませんが、気になるならば、適宜改造してみてください。
<?php
define ('WPJA_SITE_PASS', 'your_password');
function wpja_force_basic_auth() {
if (! defined('WP_USE_THEMES')) {
return;
}
if (! isset($_SERVER['PHP_AUTH_PW'])) {
header('WWW-Authenticate: Basic realm="Please Enter Site Password"');
header('HTTP/1.0 401 Unauthorized');
echo "Authorization Required";
exit;
} elseif (strcmp($_SERVER['PHP_AUTH_PW'], WPJA_SITE_PASS) === 0) {
return;
} else {
echo "Bad Password";
exit;
}
}
add_action('init', 'wpja_force_basic_auth');
?>
このエラーの場合、注目すべきなのは、"output started at" の方です。9行目、10行目の header コマンドを実行しようとしたけど、すでにヨソで画面出力が行なわれているので実行できない、という内容なので、「先に画面出力してしまった」方を改善しなければならないのです。
output started at /usr/home/○○○○○○/html/blog/my-hacks.php:23
ということで、my-hacks.php の23行目で画面出力がされている、となっています。コードは22行しかないので、末尾に余計な改行とかついてないでしょうか? ?> の後には何もつけてはいけません。
それだけでは不十分です。13行目でパスワード照合をしていますが、ここで ID 照合も行う必要があります。
ID とパスワードを両方入れさせるならば、複数の ID, パスワードを設定できた方がいいですから、2行目の define 文はやめて、配列にした方がよさそうです。もっと凝るならば、ID, パスワード設定ファイルを外部に置いて、それを読み込むとか、パスワードは sha1 でハッシュして保存しておくとかの改造が考えられます。
<?php
global $wpja_site_pass;
$wpja_site_pass = array(
'user_1' => 'pass_1',
'user_2' => 'pass_2',
);
function wpja_force_basic_auth() {
if (! defined('WP_USE_THEMES')) {
return;
}
global $wpja_site_pass;
if (! isset($_SERVER['PHP_AUTH_ID'])) {
header('WWW-Authenticate: Basic realm="Please Enter Site Password"');
header('HTTP/1.0 401 Unauthorized');
echo "Authorization Required";
exit;
} elseif (array_key_exists($_SERVER['PHP_AUTH_ID'], $wpja_site_pass) &&
strcmp($wpja_site_pass[$_SERVER['PHP_AUTH_ID']], $_SERVER['PHP_AUTH_PW']) === 0) {
return;
} else {
echo "Bad Password";
exit;
}
}
add_action('init', 'wpja_force_basic_auth');
?>
ごめんなさい。PHP_AUTH_ID じゃなくて PHP_AUTH_USER が正解でした。
<?php
global $wpja_site_pass;
$wpja_site_pass = array(
'user_1' => 'pass_1',
'user_2' => 'pass_2',
);
function wpja_force_basic_auth() {
if (! defined('WP_USE_THEMES')) {
return;
}
global $wpja_site_pass;
if (! isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Please Enter Site Password"');
header('HTTP/1.0 401 Unauthorized');
echo "Authorization Required";
exit;
} elseif (array_key_exists($_SERVER['PHP_AUTH_USER'], $wpja_site_pass) &&
strcmp($wpja_site_pass[$_SERVER['PHP_AUTH_USER']], $_SERVER['PHP_AUTH_PW']) === 0) {
return;
} else {
echo "Bad Password";
exit;
}
}
add_action('init', 'wpja_force_basic_auth');
?>
ブラウザー・端末によって、パスワード間違いのとき再度認証画面が出ないことがありそうです。このため、コードを以下のように直して頂けると幸いです。
<?php
global $wpja_site_pass;
$wpja_site_pass = array(
'user_1' => 'pass_1',
'user_2' => 'pass_2',
);
function wpja_force_basic_auth() {
if (! defined('WP_USE_THEMES')) {
return;
}
global $wpja_site_pass;
if (isset($_SERVER['PHP_AUTH_USER']) && array_key_exists($_SERVER['PHP_AUTH_USER'], $wpja_site_pass) && strcmp($wpja_site_pass[$_SERVER['PHP_AUTH_USER']], $_SERVER['PHP_AUTH_PW']) === 0) {
return;
} else {
header('WWW-Authenticate: Basic realm="Please Enter Site Password"');
header('HTTP/1.0 401 Unauthorized');
if (! isset($_SERVER['PHP_AUTH_USER'])) {
echo "Authorization Required";
} else {
echo "Bad Password";
}
exit;
}
}
add_action('init', 'wpja_force_basic_auth');
?>