mod_wsgi,.htaccess和rewriterule

我正在通过mod_wsgi在同一个apache实例上运行几个django项目,每个站点都configuration了虚拟主机,请参阅这里的httpd.conf。 对于我想使用静态caching( staticgenerator )的站点之一,所以我build立了一个.htaccess文件的目录,其中包含:

RequestHeader unset X-Forwarded-Host RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}/index.html !-f RewriteRule ^(.*) http://127.0.0.1:3456/$1 [P] 

其中3456是服务器上的django端口。 使用这个重写规则,即使文件或目录存在,请求总是被转发到mod_wsgi处理程序,并且如果文件index.html存在,请求显示为request-path/index.html 。 我尝试了另一个设置:

 RequestHeader unset X-Forwarded-Host RewriteEngine on RewriteBase / RewriteCond $1 !-d RewriteCond $1index.html !-f RewriteRule ^(.*) http://127.0.0.1:3456/$1 [P] 

但得到了几乎相同的结果。 所有请求都被传送到mod_wsgi处理程序,但请求path现在是原始的。 把它们加起来:

  1. 什么是在这里使用正确的RewriteCond?
  2. 你如何将请求传输到mod_wsgi处理程序? 这是正确的方式吗?
  3. 如果不是这样做,那么如何在目录中存在静态文件时,如何从apache / mode_wsgi提供静态文件?

谢谢你的帮助。

如果没有真正的testing,请使用如

 <Virtualhost *:28512> ServerName site1.com ServerAlias www.site1.com DocumentRoot /home/mehome/webapps/djangoprojects/site1 <Directory /home/mehome/webapps/djangoprojects/site1> Order allow,deny Allow from all AddHandler wsgi-script .wsgi Options ExecCGI RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /site.wsgi/$1 [QSA,PT,L] </Directory> </VirtualHost> 

把你的Django WSGI脚本文件作为:

/home/mehome/webapps/djangoprojects/site1/site.wsgi

它应该包含mod_wsgi wiki中logging的fixup,所以它说的是这样的:

 import django.core.handlers.wsgi _application = django.core.handlers.wsgi.WSGIHandler() import posixpath def application(environ, start_response): # Wrapper to set SCRIPT_NAME to actual mount point. environ['SCRIPT_NAME'] = posixpath.dirname(environ['SCRIPT_NAME']) if environ['SCRIPT_NAME'] == '/': environ['SCRIPT_NAME'] = '' return _application(environ, start_response) 

然后根据它必须匹配的URL在适当的位置有静态文件生成器转储文件:

 /home/mehome/webapps/djangoprojects/site1 

应该发生的是,重写规则将检查Apache是​​否findURL的静态文件,如果没有redirect到Django应用程序。

在官方的mod_wsgi邮件列表上询问这种复杂的设置要好得多。 这个例子在过去已经被提出了很多次,并且在邮件列表档案中以及在文档中被解释的基础。

我想避免Directory指令,而且,我更喜欢WSGIScriptAlias而不是AddHandler wsgi-script .wsgi

 <VirtualHost *:80> ... DocumentRoot /home/username/www/domain.tld/htdocs ... # %{DOCUMENT_ROOT} is needed because outside of directories, # REQUEST_FILENAME is the same as REQUEST_URI, # ie '/foo', not '/physical/path/to/foo' # RewriteEngine On RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f RewriteRule ^/(.*)$ /site.wsgi/$1 [QSA,L,PT] WSGIScriptAlias /site.wsgi /home/username/www/domain.tld/deploy/site.wsgi </VirtualHost> 

这将通过请求传递给静态文件,并让WSGI处理其余的。