apache + cgi + web.py 时遇见的pathinfo问题

首先,我想把web.py放在一个子目录下, 因为其它目录还有其它的文件。

网站根目录为

/var/www 

web.py的目录为

/var/www/webpy 

apache的配置

gedit /etc/apache2/sites-available/default

       DocumentRoot /var/www
       
           Options +ExecCGI +FollowSymLinks
           AllowOverride All
           Order allow,deny
           Allow from all
       
 

.htaccess的配置

AddHandler cgi-script .py
DirectoryIndex py-cgi-index.py
AddType text/html .py

       RewriteEngine on
       RewriteCond %{REQUEST_FILENAME} !-f
       RewriteCond %{REQUEST_FILENAME} !-d
       RewriteRule ^(.*)$ py-cgi-index.py/$1 [L]
 

py-cgi-index.py的代码

#!/usr/bin/env python

import sys, os
abspath = os.path.dirname(__file__)
sys.path.append(abspath)
os.chdir(abspath)

import web

class Hello:
       def GET(self,path=''):
           return path

if __name__ == "__main__":
       if os.environ.has_key('PATH_INFO'):
           urls = (
               '/(.*)', 'Hello'
           )
       else:
           urls = (
               '/.*', 'Hello'
           )
       application = web.application(urls, locals())

       application.run() 

遇见的问题

urls的配置

我之前的写法是:

urls = (
       '/(.*)', 'Hello'
   ) 

这样写,如果访问的是:

http://localhost/webpy/xxx 

它会正常的输出:

xxx 

这说明RewriteRule正常的工作了。 但是如果访问

http://localhost/webpy/ 

它会报告异常,意思是urls中没有匹配的路由规则。 搜索了一圈,发现其实这个时候RewriteRule并没有工作, 而是DirectoryIndex在起作用。

后来,我看了一些开源的php框架的源代码, 发现想知道RewriteRule有没有工作,可以通过环境变量中是否有'PATH_INFO'来判断。 最终变成了现在的代码。