2017-04-07 110 views
0

我想用Apache2 mod_rewrite來控制訪問。具體而言,我只想讓某些IP訪問我的網站。我可以在Apache2 mod_rewrite中使用MySQL查詢中的多個結果嗎?

我明白,我可以使用文件如

RewriteMap hosts-allow "txt:/path/to/hosts.txt" 

我已閱讀,我還可以使用SQL查詢,但顯然它僅適用於一個結果,如果返回了多個行則使用隨機一個。有一些方法可以使用多個結果嗎?

否則,我必須自動保存從我的MySQL的IP到自己文件以使用多個結果嗎?

如果是,那麼Apache2會在文件更改時自動刷新文件緩存?

任何見解都非常歡迎,感謝:)

回答

0

我得到它的工作。

如果你有類似的問題,那麼你的Apache2文件000-default.conf(在你的Linux發行版上查找這個文件的位置)看起來像這樣。

<VirtualHost *:80> 

    DBDriver mysql 
    DBDParams "host=localhost,user=root,pass=password,dbname=name" 

    RewriteMap whitelist "dbd:SELECT ip FROM users WHERE ip = %h LIMIT 1" 

    <Directory /var/www> 
     RewriteEngine On 
     RewriteCond "${whitelist:%{REMOTE_ADDR}|FOUND}" "FOUND" 
     RewriteRule "^" "" [F] 
    </Directory> 

    ... 

</VirtualHost> 

我們解釋一下這裏

RewriteMap whitelist "dbd:SELECT ip FROM users WHERE ip = %h" 

參數%h表示請求IP地址,所以它不會使用來自SQL查詢的多個結果,但由於WHERE只會返回行當它滿足條件時,它可以用於任何數量的IP。

RewriteCond "${whitelist:%{REMOTE_ADDR}|FOUND}" "FOUND" 

的:%{REMOTE_ADDR}搜索REMOTE_ADDR白名單中,這將很可能含有隻有當它被發現與SQL查詢的IP地址,否則它是空的。

RewriteRule "^" "" [F] 

這裏[F]表示禁止,你可以將其設置爲例如[R]重定向,但你要回去看看如何使用它的更多信息,以及「^」是指這條規則適用於所有網址。

空的「」是Apache2在.txt地圖中預期的關鍵分隔符(?),但由於我們使用SQL查詢,因此我們在這裏沒有任何內容。

如果你想使用mod_dbd與MySQL,那麼你必須(在Debian 8例如)安裝一個軟件包

sudo apt-get install libaprutil1-dbd-mysql 

或者以其他方式設置後的Apache2將不會啓動開始DBDriver到mysql

你必須也使mod_rewrite的和Apache2中mod_dbd

a2enmod rewrite 
a2enmod dbd 

希望它是有用的人:)

相關問題