使用mod_rewrite隐藏在Web浏览器上访问的Python脚本的.py扩展名

我想隐藏在Web浏览器中加载的Python脚本的.py扩展名,并且仍然运行脚本。 例如:在地址栏inputurl.dev/basics/pythonscript会激发pythonscript.py并在浏览器窗口中显示结果。

  1. URL url.dev/basics/pythonscript获取静态文件/pythonscript.py
  2. 浏览器仍然显示url url.dev/basics//pythonscript

url.dev/basics/pythonscript.py打字确实可以工作,并显示Python脚本结果。 我也可以得到mod_rewrite来重写url.dev/basics/phpscripturl.dev/basics/phpscript.php并在后台成功运行PHP代码。

但是url.dev/basics/pythonscript不会redirect到url.dev/basics/pythonscript.py (我得到一个404 Not Found)

背景信息

A) PHP重写工作:位于url.dev/basics/ WORKS for PHP脚本的.htaccess中的以下内容:

 <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 Not Found)

 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /basics/ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.py -f RewriteRule ^(.*)$ $1.py </IfModule> 

C)我是通过练习2开始工作的初学程序员:您在Internet软件工程的基础部分中的第一个程序 。 我试图按照build议使用“一个URL =一个文件”,但想使用Python而不是PHP的执行环境。 我意识到,这不是构buildWeb应用程序的最佳方式。 在上面的课程的开始部分,这只是一个惯例。

D)我在OS 10.6 Snow Leopard中设置了虚拟主机开发环境,以便我可以通过adactio.com上的'Hacky Holidays'在url.dev上访问我的开发。 我的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 configured -恢复正常的操作

期待任何帮助!

如果你在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" ------ 

警告…您可能会在您的error_log文件中看到类似下面的错误。

 [Thu Aug 05 19:26:34 2010] [alert] [client 127.0.0.1] /home/websites/testing/htdocs/basics/.htaccess: Option ExecCGI not allowed here 

如果发生这种情况,您的网络服务器不允许您的.htaccess文件进行更改

您的网络服务器将需要允许您的htaccess文件中的更改,所以您可能需要启用httpd.conf文件中的Allowoverride All

 <Directory "/"> .... Allowoverride All </Directory> 

我找到了解决方案:我需要添加应用程序的MIME类型,以便Apache Web服务器了解它应该运行的代码。

在url.dev/basics/.htaccess中添加:

 <Ifmodulee mime_module> AddType application/x-httpd-py .py </Ifmodulee> 

别忘了重启Apache: sudo apachectl graceful

它的工作原理! http://url.dev/basics/pythonscript在pythonscript.py中运行代码&#xFF01; 请注意,我不确定这是否是最好的方法,但它的工作原理。

这是我完整的.htaccess文件:

 # Options +ExecCGI # SetHandler cgi-script <Ifmodulee mime_module> AddType application/x-httpd-py .py </Ifmodulee> <Ifmodulee mod_rewrite.c> RewriteEngine On RewriteBase /basics/ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.py -f RewriteRule ^(.*)$ $1.py </Ifmodulee>