Mod_Rewrite现有文件检查变为梨形,或传递错误的查询字符串

时间:2010-08-01 06:41:28

标签: python .htaccess mod-rewrite

我正在使用Apache,Python(fastcgi),mod_rewrite。

我想要

http://foo/bar

将内部重定向到

http://main.py?q=foo/bar

现在我的.htacess文件包含

Options +ExecCGI
AddHandler cgi-script .py
DirectoryIndex main.py

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule (.*) main.py?q=$1

通常工作正常。使用查询字符串q = foo / bar重定向到main.py 但是,如果我有一个名为foo.py的脚本,它会指向foo.py而不是main.py。

我尝试删除RewriteConds并将RewriteRule单独作为一个包罗万象。

然后它总是重定向到main.py ok,但是传递给我脚本的查询字符串是q = main.py,它应该是q = foo / bar

现在有各种各样的问题,我可以尝试重构我的代码,文件布局等,但我想知道在它导致更多问题之前发生了什么。

所以我想要a)停止它认为foo意味着foo.py或b)使它完全跳过现有的文件检查并传递正确的查询字符串。

2 个答案:

答案 0 :(得分:1)

这听起来像是内容协商的问题。尝试添加...

Options -Multiviews

...位于.htaccess文件的顶部。

答案 1 :(得分:1)

您的第一个问题是由MultiViews导致的,该问题正在解析现有文件foo/bar中不存在的资源foo.py,然后可能会将PATH_INFO传递给/bar 1}}。您可以修改.htaccess

,在Options文件中将其停用
Options -MultiViews +ExecCGI

在禁用MultiViews的情况下使用原始规则集可以解决您的问题。但是,为了完整起见,查询字符串最终为q=main.py的原因是因为删除重写条件时处理请求的方式:

  • mod_rewrite收到请求,foo/bar匹配.*并重写为main.py?q=foo/bar
  • mod_rewrite执行内部重定向并将自己指定为处理程序
  • 重定向由mod_rewrite重新处理,main.py.*匹配,并重写为main.py?q=main.py
  • mod_rewrite执行内部重定向并将自己指定为处理程序
  • 重定向由mod_rewrite重新处理,main.py.*匹配,并重写为main.py?q=main.py
  • mod_rewrite意识到您将进入无限循环,将相同的请求重定向到自身,并停止重定向过程