我正在使用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)使它完全跳过现有的文件检查并传递正确的查询字符串。
答案 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
意识到您将进入无限循环,将相同的请求重定向到自身,并停止重定向过程