使用mod_rewrite隐藏通过网页浏览器访问的Python脚本的.py扩展名
我想在网页浏览器中隐藏Python脚本的.py后缀,但仍然让这个脚本运行。比如说,输入 url.dev/basics/pythonscript
在地址栏里,就能触发执行pythonscript.py,并在浏览器窗口中显示结果。
- 这个网址 url.dev/basics/pythonscript 会获取静态文件 /pythonscript.py
- 浏览器依然显示网址 url.dev/basics/pythonscript
如果我输入 url.dev/basics/pythonscript.py
是可以工作的,Python脚本的结果会显示出来。我也可以使用mod_rewrite把 url.dev/basics/phpscript
重写成 url.dev/basics/phpscript.php
,并成功在后台运行PHP代码。
但是 url.dev/basics/pythonscript
并不会重定向到 url.dev/basics/pythonscript.py
(我得到的是404未找到)。
背景信息
A) PHP重写是有效的:在url.dev/basics/中的.htaccess文件里,以下内容可以正常工作,适用于PHP脚本:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /basics/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
</IfModule>
B) Python重写无效:在url.dev/basics/中的.htaccess文件里,以下内容对Python脚本无效 (我得到的是404未找到):
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /basics/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.py -f
RewriteRule ^(.*)$ $1.py
</IfModule>
C) 我是一个初学编程的人,正在学习 练习2:你的第一个程序,这个练习在互联网应用软件工程基础部分。我想按照建议使用 '一个网址 = 一个文件' 的执行环境,但想用Python而不是PHP。我意识到这并不是构建网络应用程序的最佳方式。这只是上面链接课程初期使用的一种约定。
D) 我在OS 10.6 Snow Leopard中设置了虚拟主机开发环境,这样我就可以通过url.dev访问我的开发内容,参考了adactio.com的'Hacky Holidays'。我的Python版本是Python 2.6.1。
E) 我计划最终使用Django,但如果可能的话,想先做一些简单的代码,以便更好地理解发生了什么。
F) 我的httpd.conf文件中有以下内容:
TypesConfig /private/etc/apache2/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddHandler cgi-script .py
还有:
LoadModule php5_module libexec/apache2/libphp5.so
LoadModule fastcgi_module libexec/apache2/mod_fastcgi.so
G) 我的Apache版本(在重启服务器后在服务器日志中看到的):Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8l DAV/2 PHP/5.3.1 mod_fastcgi/2.4.2 配置完成 -- 恢复正常操作
期待任何帮助!
2 个回答
如果你在使用Linux系统,不要用mod-rewrite,直接重命名你的脚本。
你可以把脚本叫做pythonscript,而不是pythonscript.py。
在脚本的第一行加上指向你的Python解释器的路径。
然后把这个文件设置为可执行。
可以用下面的命令:
chmod +x pythonscript
当文件被执行时,它会读取文件的第一行,并执行第一行中的解释器。
#!/usr/bin/python
接着设置目录来执行这个脚本。
为了让这个工作,你需要在你的.htaccess文件中更改目录下文件的可执行权限。
basics/.htaccess
-----------
Options +ExecCGI
SetHandler cgi-script
-----------
你的Python脚本看起来应该是这样的:
basics/pythonscript
-------
#!/usr/bin/python
print "STATUS: 200 OK\n\n"
print "hello world"
------
警告……你可能会在错误日志中看到这样的错误。
[Thu Aug 05 19:26:34 2010] [alert] [client 127.0.0.1] /home/websites/testing/htdocs/basics/.htaccess: Option ExecCGI not allowed here
如果出现这种情况,说明你的Web服务器不允许你在.htaccess文件中做的更改。
你的Web服务器需要能够允许.htaccess文件中的更改,所以你可能需要在httpd.conf文件中启用Allowoverride All。
<Directory "/">
....
Allowoverride All
</Directory>
我找到了解决办法:我需要添加应用的MIME类型,这样Apache网页服务器才能理解它应该运行这段代码。
在url.dev/basics/.htaccess文件中添加:
<IfModule mime_module>
AddType application/x-httpd-py .py
</IfModule>
别忘了重启Apache:sudo apachectl graceful
这样就可以了! http://url.dev/basics/pythonscript 可以运行pythonscript.py里的代码!不过我不确定这是不是最好的方法,但确实有效。
这是我完整的.htaccess文件:
# Options +ExecCGI
# SetHandler cgi-script
<IfModule mime_module>
AddType application/x-httpd-py .py
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /basics/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.py -f
RewriteRule ^(.*)$ $1.py
</IfModule>