这个问题在概念上类似于this one,但我发现我需要与Apache进行更深入的集成。
我通过PHP验证用户并设置一个带有会话ID的cookie,然后可以在数据库表中查找该用户名以查找用户名。我还需要在Apache中设置REMOTE_USER
变量,这样我就可以通过AJP连接和常规HTTP连接将该变量传递给其他应用程序服务器,这些服务器无法设置为从cookie中读取信息。 / p>
看来我需要更深入地与Apache(版本2)集成,甚至可能编写模块,以便正确地完成此操作。有没有人有任何关于如何使用尽可能少的非PHP胶水代码实现这一点的例子?虽然我当然熟悉其他几种语言,但我希望这个项目尽可能简单,以便那些必须在我之后维护它的人。
感谢您的任何指示!
答案 0 :(得分: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文件夹中。
这是我用Python编写的Apache模块:
# -*- 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配置中的行,这样就不会对每个请求都进行无用的方法调用。