ログインページにアクセス制限を付けたいです。

Events happening in the community are now at Drupal community events on www.drupal.org.
hitomi_o_o's picture

こんにちは、毎度お世話になっております。
表題の件についての質問です。

例えば、http://hogehoge.com/user
といったログインページにだけ、アクセス制限をかけたいと思っています。
条件としては、
●特定のホストやIPの人だけがログインページにアクセスできるようにする。
●その他の人は、トップページに転送される。

userモジュールのフォルダに.htaccessを置いてやってみているのですが、うまくいきません。
モジュールや記述などで良い方法が有りましたら、ご教授お願い致します。

※もし場違いな質問であれば、申し訳ありません。

Comments

qchan's picture

Drupalはインストールディレクトリの"index.php" に全てのアクセスを一旦集めてから、
それぞれのURLへタスクを割り振ります。
モジュールフォルダへはブラウザから直接アクセスすることはないですので、
.htaccessへ何か書きたい場合は、インストールディレクトリ直下の.htaccessに追記します。

アップデート時には上書きされないように.htaccessファイルをバックアップしてからされると良いと思います。
また、環境などが許せばApacheのバーチャルホストの設定に書いておけばアップデートの際に気にせずに作業ができます。

qchan様

hitomi_o_o's picture

ありがとうございます。

>.htaccessへ何か書きたい場合は、インストールディレクトリ直下の.htaccessに追記します。
なるほど、直下にある.htaccessに追記してしまっていいんですね。
使用するのは、RewriteRuleとか RewriteCondでしょうか…
この辺の知識はかなり不足しているので、調べつつやってみます。
ありがとうございます。

今.htaccessのの中に、以下のように追記してみています。
500エラーが出て動かないので、調べて進めてみます。

#REMOTE_ADDRに書かれたIPなら、/userへRedirect
RewriteCond %{REMOTE_ADDR} ^(000.000.00.000$)
RewriteRule ^/user/$ /user/$

#REMOTE_ADDRに書かれたIPでない場合、userから/index.phpへRedirect
RewriteCoud {[REMOTE_ADDR} !^(000.000.00.000$)
RewriteRule ^/user/$ index.php$

途中経過です。

hitomi_o_o's picture

調べつつ直してみていますが、うまくいきません。
一度、ページが表示されたものの、どこのページにも遷移できないという状況に。
その後、戻して直してみましたが、500Errorになってしまいます。

おかしい点が多々あるかと思いますが、何かアドバイスを頂ければと思います。

.htaccess内
# 書き換えのベースパス
RewriteBase http://hogehoge.com/user

# 条件
# REMOTE_ADDRのアドレス以外の場合、/userへのアクセスがあったらトップに戻す。
RewriteCond %{REMOTE_ADDR} !111.222.333.444\
RewriteRule ^/user$ [R=301,L] RewriteRule ^.* - [F]

※RewriteRuleが今アクセス禁止になっていますが、トップページ転送に直したいと思っています。

.htaccessにはすでにRewriteRuleが書かれ

qchan's picture

.htaccessにはすでにRewriteRuleが書かれていますから、追記する場所がおかしいと
上手く動きません。

Drupal7を前提に書きますが、
99行目あたり、
# Pass all requests not referring directly to files in the filesystem to
# index.php. Clean URLs are handled in drupal_environment_initialize().
の2行の前に

    RewriteCond %{REMOTE_ADDR} !^111\.222\.333\.444
    RewriteRule (^user$|^user/(.*)$) /  [R=302,L]

と書き入れると
"REMOTE_ADDRのアドレス以外の場合、/userへのアクセスがあったらトップに戻す。"
が実現出来るはずです。

正規表現とmod_rewriteのオプションなどはここで解説するのは難しいですね。
Drupalとは独立したWeb制作一般の話ですので、日本語情報も多いですから、
Apacheのmod_rewrite の設定の書き方は別途検索などして調べてみてください。

カスタムモジュールで

shigehiro's picture

久しぶりに時間が取れたので投稿させて頂きます。^^

カスタムモジュールにフックを記述する方法なら、こんな感じでどうでしょう?
メニュールーターの設定を変更します。

<?php

/**
* Implementation of hook_menu_alter()
*/
function custom_menu_alter(&$items) {
 
// '/user' のパスの処理を行うコールバック関数を変更する
 
$items['user']['page callback'] = 'custom_user_page';
 
$items['user']['file'] = 'custom.module';
 
$items['user']['file path'] = drupal_get_path('module', 'custom');
}

/**
* メニューコールバック
*/
function custom_user_page() {
 
// 特定の IPアドレスからのアクセスはトップページにリダイレクト
 
if (in_array($_SERVER['REMOTE_ADDR'], array('127.0.0.1'))) {
   
drupal_goto();
  }

 
// そうでなければ通常のユーザーページを表示する
 
module_load_include('inc', 'user', 'user.pages');
  return
user_page();
}

?>

ちなみにトップページにリダイレクトしないで良ければ、hook_menu_alter() で

$items['user']['access callback']

を変更することも出来ます。その場合は単に Access denied となります。

Drupal カスタマイズTips 更新中...
CMS自由自在!
http://customfield.jp/

日本 コミュニティ: Drupal Japan User Group

Group organizers

Group categories

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds: