轻量级服务器lighttpd的mod_rewrite与Apache的mod_rewrite在Django和FastCGI中的区别

3
我正在从在Apache上使用Django FastCgi设置迁移到在lighttpd上的设置。
在Apache上,我使用了Django文档中描述的fcgi配置。其中核心部分是将所有非静态URL重写为/mysite.fcgi/$1:
RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]

然后将所有对于 /mysite.fcgi 的请求转发至 FastCGI:

<IfModule mod_fastcgi.c>
    FastCGIExternalServer /opt/www/mysite.fcgi -host 127.0.0.1:8000
</IfModule>

设置对于Django有效。例如,如果我访问http://www.mydomain.com/help/并在模板中打印{{ request.get_full_path }},结果将是/help/。生活很美好,我很快乐。然而,我遇到了一些问题,这迫使我转向支持更多同时连接的Web服务器。

跳到lighttpd。所有配置都已完成。我正在使用mod_rewrite重写我的URL:

url.rewrite-once = ( "^(/media/.)$" => "$1", "^/favicon.ico$" => "/med/img/favicon/favicon.ico", "^(/.)$" => "/mysite.fcgi$1", )

并且FastCGI处理/mysite.fcgi:

   fastcgi.server = (
       "/mysite.fcgi" => (
           "main" => (
               "host" => "127.0.0.1",
               "port" => 8000,
               "check-local" => "disable",
           )
       ),
   )

一般情况下,我的Django网站运行正常。但是,当我访问http://www.mydomain.com/help/并在模板中输出{{ request.get_full_path }}时,结果是/mysite.fcgi/help/。这会导致一些问题。
尽管这通常不会引起问题,因为Django网站工作良好,但在使用SSL时会引发问题。具体来说,我使用了“Stephen Zabel - sjzabel@gmail.com”从http://www.djangosnippets.org/snippets/240/获取的sslmiddleware。该软件依赖于request.get_full_path,该函数在lighttpd下返回的值与在Apache下返回的值不同。request.path也是如此。
有人可以提出解决这个问题的方法吗?理想情况下,我希望lighttpd mod_rewrite具有与Apache mod_rewrite相同的行为。如果不可能,我希望一个lighttpd FastCGI Django设置可以与我正在使用的sslmiddleware包兼容。或者,我可以更改sslmiddleware包以与lighttpd重写URL的方式兼容。
这个答案将成为一个绝佳的30岁生日礼物!

你是使用 Django 的主干版本还是某个稳定版本?我几乎有相同的 lighttpd 配置,"request.get_full_path" 可以按照你的意愿工作。 - Mikhail Polykovskii
2个回答

3

你是否尝试在 settings.py 中定义 FORCE_SCRIPT_NAME 为 "" 并重新启动 fastcgi 服务器?

FORCE_SCRIPT_NAME=""

1
此外,在设置URL配置之前,请确保在settings.py中定义了FORCE_SCRIPT_NAME。 - shreddd

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接