話說 tomcat 沒辦法直接從 nss_ldap 抓到 user 的資料,
網路上有一招很管用的
<Listener className="org.apache.catalina.startup.UserConfig"
directoryName="public_html" userClass="org.apache.catalina.startup.PasswdUserDatabase"/>
可以抓使用者資料來做跟 apache http server 的使用者目錄一樣的功能 /~<使用者帳號>
但, 僅此於 /etc/passwd… nss_ldap 上的資料完全抓不到..哭
不過還好 tomcat 又提供了另一個方式, 就是直接去抓使用者目錄
<Listener className="org.apache.catalina.startup.UserConfig"
directoryName="public_html" homeBase="/home" userClass="org.apache.catalina.startup.HomesUserDatabase"/>
是可以運作了, 但好笑的事來了
在學校 server 使用者的 id 是
s + 學號
但目錄是這樣分的
/home/班級/學號
利用 apache 可以很順利的抓到 user 的 home dir 來透過 /~s + 學號 存取
但使用上述方式的 tomcat 笨的能用 /~ + 學號, ’s’ 不見了
(其實也不奇怪, 因為目錄上沒有 s 只有學號)
這樣會有什麼問題呢?, apache http server 上要執行 jsp 可以透過一個 module
叫 mod_jk 來連到 tomcat, 但如果 兩個 server 的路徑是不同的就會無法對映
在 apache 上執行 /~s1092137101/xxx.jsp 跑來 tomcat 上執行 => 沒有這個東西
因為就如剛講的, tomcat 只能用 /~ + 學號
沒辦法只好蠻幹了, 之前玩了一陣子的 rewrite 剛好能拿來用
一開始還不能用, 原來 rewrite 後的網址沒辦法直接給 jkMount 用
還好眼尖, 看到 document 上有 [PT] 這個東西…就是 Pass Through
把 rewrite 後的網址傳給下一個敘述,
那當然是要給 jkMount 啦!, ..成功了, 當然要好好記錄一翻
<IfModule mod_jk.c>
JkWorkersFile /usr/local/etc/apache22/workers.properties
JkLogFile logs/jk.log
JkLogLevel warn
# Sample JkMounts. Replace these with the paths you would
# like to mount from your JSP server.
<IfModule rewrite_module>
RewriteEngine on
RewriteRule ^/~[sm](.*)/(.*).jsp /~$1/$2.jsp [PT]
</IfModule>
JkMount /*.jsp jsp-host
JkMount /servlet/* jsp-host
JkMount /examples/* jsp-host
</IfModule>
其實在共用 php 及 jsp 的時候, 會有一個漏洞
就是用 tomcat 有辦法直接看到 php 的 source code,
由於 apache 已經自動把所有 jsp 檔都轉給 tomcat 執行
所以反之 “不” 亦然啦.. apache 沒辦法看到 jsp 的 source code
但這樣問題 就簡單了, 把 tomcat 對外的管道都封了, 只留下 mod_jk 用的
就大功告成啦!
—–
最新回應