2012-03-15 36 views
0

這個問題在概念上與this one類似,只是我看到我需要與Apache更深入的集成。通過PHP在Apache中設置REMOTE_USER

我通過PHP驗證用戶身份,並設置一個會話ID,然後可以在數據庫表中查找用戶名稱的cookie。我還需要在Apache中設置REMOTE_USER變量,以便我可以通過AJP連接和常規HTTP連接將該變量傳遞給其他應用程序服務器,以便使用無法設置爲從Cookie中讀取信息的應用程序。

看來我需要更深入地與Apache(第2版)進行整合,甚至可能編寫一個模塊來正確執行此操作。有沒有人有任何例子說明如何用盡可能少的非PHP膠水代碼來實現這一點?雖然我非常熟悉其他幾種語言,但我仍然希望這個項目儘可能簡單,以便那些不得不在我之後維護它的人。

感謝您的指點!

+0

您能否提供關於您的架構的更多信息,請求如何流經整個堆棧等?如果您需要通過HTTP傳遞信息,爲什麼不使用GET/POST參數或只是標題? – galymzhan 2012-03-16 18:32:11

回答

0

PHP不提供PHP腳本訪問Apache變量。雖然有一個function來設置環境變量,但據報道它不會設置REMOTE_USER。

您可以在PHP處理程序啓動之前執行您想要的操作,並在PHP作品之前和之後添加其他處理程序到階段後結束。你可以用C編寫你的處理函數。但既然你的意思是要有一個PHP程序員可以在你之後訪問的解決方案,我相信Python是一個很好的選擇。

mod_python允許你很容易地做到這一點。如果你去它的網站,你可以看到它的最新更新是2008年2月;但它已經成熟穩定。它們不會繼續開發,因爲當前的Python-Apache集成繼續使用mod_wsgi而不是mod_python。由於mod_wsgi堅持使用WSGI,因此mod_python不提供特定於Apache的功能。

安裝完mod_python之後,你所需要的就是編寫簡單的函數,當你想要的時候就可以運行。下面是在PHP之前和之後運行兩個函數的示例,以便您可以訪問由PHP設置的cookie。

Apache的配置:

# Enable mod_python: 
LoadModule python_module modules/mod_python.so 

# Enable it as a handler: 
AddHandler mod_python .py 
    # extension does not matter since we are not setting contentHandlers. 
    # py files will continue being served as text/plain if you have any of them 
    # under your document root. 

# Handler that will run before PHP: 
PythonFixupHandler set_auth_user 

# Handler that will run after PHP: 
PythonCleanupHandler set_auth_user 

這種配置需要set_auth_user.py其中Python可以導入。你可以把它放在Python安裝的site-packages文件夾中。

這裏是我們的Apache模塊用Python寫的:

# -*- coding: utf-8 -*- 
from mod_python import apache 

def fixuphandler(req): 
    apache.log_error("starting :"+str(req.headers_out.get('Set-Cookie'))) 
    return apache.OK 

def cleanuphandler(req): 
    apache.log_error("cleaning up: "+str(req.headers_out.get('Set-Cookie'))) 
    req.user='hasanyasin' #this is how you update AUTH_USER 
    return apache.OK 

這裏是我們的PHP文件:

<?php 
setcookie('abc','foobar'); 
?> 

這裏是我的Apache日誌的請求後,向服務器發出:

[Sun Jul 01 15:29:31 2012] [error] cleaning up: None 
[Sun Jul 01 15:29:31 2012] [error] cleaning up: abc=foobar 

我希望這可以按照你需要的方式解決你的問題。我添加了兩個用於演示的處理函數。如果您只需要其中的一個,請在Apache配置中刪除該行,以便每個請求都不會有無用的方法調用。