2011-08-19 76 views
10

我正在尋找一種方法來使用PHP腳本來控制對Apache資源的訪問。我想擁有不依賴於目標資源的訪問控制;即它可以用於html,文件,其他腳本和cgi程序,就像「允許來自」或「拒絕來自」指令將會這樣 - 除了使用自定義邏輯。如何在Apache中使用PHP腳本進行訪問控制

我看了幾種方法可以嘗試管理這樣的:

  1. 使用像mod_auth_script Apache模塊(確定,但這個模塊是舊的,我以爲不能很好地擴展)
  2. 使用FastCGI的指令FastCgiAccessChecker
  3. 創建我自己的Apache模塊調用PHP和做任何我需要

這些#2看上去最有希望的,也是最便攜給出FastCG的普及一世。 因此,我設法換出了通常的linux php模塊,並通過fastcgi代替了php。這是比在Windows困難,但得到它作爲一個外部服務器到山前必有路,即使用Apache指令

FastCGIExternalServer /var/www/html/thing -host 192.168.0.11:9000

並啓動PHP守護

php-cgi -q -b 192.168.0.11:9000 &

麻煩就來了,試圖找到一種使用FastCgiAccessChecker調用PHP腳本的方法。

我試過各種方法嘗試通過更改FastCGIExternalServer和/或FastCgiAccessChecker指令中的文件名來運行腳本名稱 - 不起作用。 我也試着開始的php-cgi的一個腳本說明符,即

php-cgi -q -b 192.168.0.11:9000 -f /var/www/html/thing/access.php &

沒有什麼工作。我可以告訴Apache識別我的指令,因爲當我包含FastCgiAccessChecker,然後訪問一個PHP頁面,內容類型更改爲文本/純文本,並且如果它是腳本,我將丟失頁面中第一個〜8000字節的內容。想法爲什麼)。但它不會調用我想運行的PHP腳本。

據我所知,發生的事情是FastCgiAccessChecker認爲指定的fastcgi服務器是專門編譯爲訪問檢查程序的。沒有辦法告訴fastcgi服務器(在我的情況下是PHP)執行訪問檢查的腳本。

我搜索了網頁,並據我所知,沒有人曾經嘗試過使用PHP腳本,或者沒有人寫過關於它的文章。

所以我的問題:我該怎麼做? 我可以看到幾種可能性:

1)我失去了一些東西,有一些神奇的方式讓FastCgiAccessChecker做我想做的:運行PHP腳本來控制Apache訪問控制

2)我寫的我自己的FastCGI服務器在c中並嵌入了PHP,所以我可以指定我想運行的PHP腳本(我花了幾分鐘的時間查看這個;它看起來很複雜和可怕,而且我從1995年開始就沒有在c中工作)

3)我放棄了FastCGI並編寫了一個apache模塊來直接調用我的PHP腳本來控制訪問。 (也看起來很複雜;而且這種技術需要爲執行PHP的每個請求產生一個新的進程。)

有沒有人有任何建議,要麼就如何讓FastCGI做我想做的事情,要麼)FastCGI的簡單替代方案?

謝謝任何​​你可以建議

回答

8

我對這類情況的辦法是結合使用mod_xsendfilemod_rewrite。這些可能不會出現做你想做第一的,但如果你:

  1. 使用mod_rewrite規則創建一個前端控制器(一個PHP腳本,處理所有傳入的請求)。
  2. 通過查看$ _SERVER(可能是$ _SERVER ['PATH_INFO'])的內容來確定正在請求的文件。
  3. 在此處插入您的訪問控制/安全層。
  4. 如果安全通過,請使用mod_xsendfile發送文件的內容。

你基本上可以用這種方式實現你想要的任何安全系統。

mod_xsendfile本質上只是以與Apache直接訪問文件相同的方式發送文件。它非常穩定,在我所遇到的每一種情況下都表現出色。它也應該「沒有任何設置的巨大負擔」,你似乎正在努力一點。

+0

我喜歡這個解決方案! – Achronos

0

你可能想看看shell_exec()system()。只要您在cfg中啓用了它們,就可以讓您執行linux shell cmds。另外,對於FastCGI,我建議您安裝php5-fpm。很容易做到#的apt-get安裝PHP5-FPM

+0

你好蒂莫西,謝謝你的迴應。 我需要的是一種告訴Apache使用PHP腳本來決定是否允許訪問頁面的方法。 FastCGI實際上對我來說工作得很好,只是我看不到讓FastCGIAccessChecker指令爲PHP工作的方法。 – Achronos

0

我目前正在處理類似的問題 - 在我的情況下,我需要在PHP中設置(經過身份驗證的)遠程用戶。簡而言之,您將會話cookie和經過身份驗證的用戶名從PHP腳本中推入memcache(查看適用於可擴展系統的couchdb版本),然後mod將用戶設置爲Apache,並且可以使用標準Apache acces控制規則。

這樣可以避免在PHP代碼中啓動其他進程/封裝所有訪問的開銷。

見問題和答案給Populating remote user in apache log files from PHP session

1

感謝您的答覆!我非常喜歡ezzatron的技術,它應該可以與任何Apache一起工作,而不需要任何定製工具。

碰巧我結束了我的#3選項去之前,我讀過的答覆:

我寫了一個Apache模塊來完成這項工作。它使用子請求對apache可以提供的任何文檔進行訪問控制,因此它適用於任何腳本語言或CGI程序。對於使用php_module或fastcgi的典型PHP配置,這可以很好地擴展,因爲不需要額外的進程。

事實證明,Apache的模塊API不是太難使用,我想C就像騎自行車 - 你永遠不會真的忘記如何。