使用mod_rewrite隐藏通过网页浏览器访问的Python脚本的.py扩展名

3 投票
2 回答
3811 浏览
提问于 2025-04-16 02:23

我想在网页浏览器中隐藏Python脚本的.py后缀,但仍然让这个脚本运行。比如说,输入 url.dev/basics/pythonscript 在地址栏里,就能触发执行pythonscript.py,并在浏览器窗口中显示结果。

  1. 这个网址 url.dev/basics/pythonscript 会获取静态文件 /pythonscript.py
  2. 浏览器依然显示网址 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 个回答

4

如果你在使用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>
1

我找到了解决办法:我需要添加应用的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>

撰写回答