重定向:mod_wsgi 和 django
Redirection: mod_wsgi and django
在此 guide 之后,我在 Debian 服务器上使用 Apache 和 mod_wsgi 安装了 Mailman 3。
我的虚拟主机的 .conf 文件:
ErrorLog /var/log/mailman-web/mailman-web.log
CustomLog /var/log/mailman-web/mailman-web_access.log combined
WSGISocketPrefix run/wsgi
<VirtualHost *:80>
ServerName XXXXXXX
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# Here, use the value of the STATIC_ROOT variable in your Django configuration file (production.py)
Alias /robots.txt /usr/local/mailman/mailman-bundler/var/mailman-web/static/hyperkitty/robots.txt
Alias /favicon.ico /usr/local/mailman/mailman-bundler/var/mailman-web/static/hyperkitty/favicon.ico
Alias /static /usr/local/mailman/mailman-bundler/var/mailman-web/static
<Directory "/usr/local/mailman/mailman-bundler/var/mailman-web/static">
Order deny,allow
Allow from all
Require all granted
</Directory>
WSGIScriptAlias / /usr/local/mailman/mailman-bundler/bin/mailman-web.wsgi
WSGIDaemonProcess mailman-web display-name=mailman-web maximum-requests=1000 processes=1 threads=1 python-path=/usr/local/mailman/venv/lib/python2.7/site-packages
<Directory "/usr/local/mailman/mailman-bundler/bin">
<Files mailman-web.wsgi>
Order deny,allow
Allow from all
Require all granted
</Files>
WSGIProcessGroup mailman-web
</Directory>
</VirtualHost>
这个设置的问题 是,当我转到 http://myhost/
时,wsgi 脚本将我的浏览器重定向到 http://myhost/archives
。我想让 http://myhost/
重定向到 http://myhost/mailman3
而不是 http://myhost/archives
.
试图找出 mailman 决定 return archives 子目录的位置,我查看了 apache .conf 文件中定义的 wsgi 脚本,但没有发生更多事情然后导入一些 类 并调用另一个脚本。按照这个脚本,我进入了文件 ´./eggs/Django-1.10.4-py2.7.egg/django/core/handlers/wsgi.py`,特别是这部分:
148 class WSGIHandler(base.BaseHandler):
149 request_class = WSGIRequest
150
151 def __init__(self, *args, **kwargs):
152 super(WSGIHandler, self).__init__(*args, **kwargs)
153 self.load_middleware()
154
155 def __call__(self, environ, start_response):
156 set_script_prefix(get_script_name(environ))
157 signals.request_started.send(sender=self.__class__, environ=environ)
158 try:
159 request = self.request_class(environ)
160 except UnicodeDecodeError:
161 logger.warning(
162 'Bad Request (UnicodeDecodeError)',
163 exc_info=sys.exc_info(),
164 extra={
165 'status_code': 400,
166 }
167 )
168 response = http.HttpResponseBadRequest()
169 else:
170 response = self.get_response(request)
171
172 response._handler_class = self.__class__
173
174 status = '%d %s' % (response.status_code, response.reason_phrase)
175 response_headers = [(str(k), str(v)) for k, v in response.items()]
176 for c in response.cookies.values():
177 response_headers.append((str('Set-Cookie'), str(c.output(header=''))))
178 start_response(force_str(status), response_headers)
179 if getattr(response, 'file_to_stream', None) is not None and environ.get('wsgi.file_wrapper'):
180 response = environ['wsgi.file_wrapper'](response.file_to_stream)
181 return response
我猜子目录 returned 的决定发生在此处某处,但我不确定,我可能是错的。
到目前为止我尝试了什么: 在 apache conf 文件中我添加了一行 Redirect permanent / http://myhost/mailman3
但这使得 apache 进入了一个以 [=45 结尾的重定向循环=]喜欢http://myhost/mailman3mailman3mailman3....
希望有人能帮我解决这个问题。
提前致谢!
I guess that the decision of the subdirectory returned
这是一个 Django 项目,所以 url 与子目录无关,它们与 Django 中的 "view" 函数匹配。在这种情况下,"decision" 发生在这里:
https://gitlab.com/mailman/mailman-bundler/blob/master/mailman_web/urls.py
urlpatterns = patterns('',
url(r'^$',RedirectView.as_view(url=reverse_lazy('hyperkitty.views.index.index'))),
url(r'^mailman3/', include('postorius.urls')),
url(r'^archives/', include('hyperkitty.urls')),
url(r'', include('social.apps.django_app.urls', namespace='social'), {"SSL": True}),
url(r'', include('django_browserid.urls'), {"SSL": True}),
)
你可以看到 "root" url ("r'^$'") 被设置为重定向到 hyperkitty.views.index.index(hyperkitty 是存档器)
如果您想让根 url 重定向到“/mailman3/”,您必须将第一个 url()
行更改为
url(r'^$',RedirectView.as_view(url="/mailman3/")),
请注意,每次更新包时都必须维护此分支。
注意:有 "better"(更安全/更清洁/更易于维护)的方法来做同样的事情(通过使用您自己的 django 设置模块而不是默认模块并使其成为 ROOT_URL_CONF
点给你的所有者 copy/pasted/edited 版本的这个 urls.py
文件,最后使用适当的 reverse_lazy
而不是硬编码 url),但是如果你对 Django 了解不多上面的(有点 Q&D)解决方案是迄今为止最简单的。
在此 guide 之后,我在 Debian 服务器上使用 Apache 和 mod_wsgi 安装了 Mailman 3。
我的虚拟主机的 .conf 文件:
ErrorLog /var/log/mailman-web/mailman-web.log
CustomLog /var/log/mailman-web/mailman-web_access.log combined
WSGISocketPrefix run/wsgi
<VirtualHost *:80>
ServerName XXXXXXX
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# Here, use the value of the STATIC_ROOT variable in your Django configuration file (production.py)
Alias /robots.txt /usr/local/mailman/mailman-bundler/var/mailman-web/static/hyperkitty/robots.txt
Alias /favicon.ico /usr/local/mailman/mailman-bundler/var/mailman-web/static/hyperkitty/favicon.ico
Alias /static /usr/local/mailman/mailman-bundler/var/mailman-web/static
<Directory "/usr/local/mailman/mailman-bundler/var/mailman-web/static">
Order deny,allow
Allow from all
Require all granted
</Directory>
WSGIScriptAlias / /usr/local/mailman/mailman-bundler/bin/mailman-web.wsgi
WSGIDaemonProcess mailman-web display-name=mailman-web maximum-requests=1000 processes=1 threads=1 python-path=/usr/local/mailman/venv/lib/python2.7/site-packages
<Directory "/usr/local/mailman/mailman-bundler/bin">
<Files mailman-web.wsgi>
Order deny,allow
Allow from all
Require all granted
</Files>
WSGIProcessGroup mailman-web
</Directory>
</VirtualHost>
这个设置的问题 是,当我转到 http://myhost/
时,wsgi 脚本将我的浏览器重定向到 http://myhost/archives
。我想让 http://myhost/
重定向到 http://myhost/mailman3
而不是 http://myhost/archives
.
试图找出 mailman 决定 return archives 子目录的位置,我查看了 apache .conf 文件中定义的 wsgi 脚本,但没有发生更多事情然后导入一些 类 并调用另一个脚本。按照这个脚本,我进入了文件 ´./eggs/Django-1.10.4-py2.7.egg/django/core/handlers/wsgi.py`,特别是这部分:
148 class WSGIHandler(base.BaseHandler):
149 request_class = WSGIRequest
150
151 def __init__(self, *args, **kwargs):
152 super(WSGIHandler, self).__init__(*args, **kwargs)
153 self.load_middleware()
154
155 def __call__(self, environ, start_response):
156 set_script_prefix(get_script_name(environ))
157 signals.request_started.send(sender=self.__class__, environ=environ)
158 try:
159 request = self.request_class(environ)
160 except UnicodeDecodeError:
161 logger.warning(
162 'Bad Request (UnicodeDecodeError)',
163 exc_info=sys.exc_info(),
164 extra={
165 'status_code': 400,
166 }
167 )
168 response = http.HttpResponseBadRequest()
169 else:
170 response = self.get_response(request)
171
172 response._handler_class = self.__class__
173
174 status = '%d %s' % (response.status_code, response.reason_phrase)
175 response_headers = [(str(k), str(v)) for k, v in response.items()]
176 for c in response.cookies.values():
177 response_headers.append((str('Set-Cookie'), str(c.output(header=''))))
178 start_response(force_str(status), response_headers)
179 if getattr(response, 'file_to_stream', None) is not None and environ.get('wsgi.file_wrapper'):
180 response = environ['wsgi.file_wrapper'](response.file_to_stream)
181 return response
我猜子目录 returned 的决定发生在此处某处,但我不确定,我可能是错的。
到目前为止我尝试了什么: 在 apache conf 文件中我添加了一行 Redirect permanent / http://myhost/mailman3
但这使得 apache 进入了一个以 [=45 结尾的重定向循环=]喜欢http://myhost/mailman3mailman3mailman3....
希望有人能帮我解决这个问题。
提前致谢!
I guess that the decision of the subdirectory returned
这是一个 Django 项目,所以 url 与子目录无关,它们与 Django 中的 "view" 函数匹配。在这种情况下,"decision" 发生在这里:
https://gitlab.com/mailman/mailman-bundler/blob/master/mailman_web/urls.py
urlpatterns = patterns('',
url(r'^$',RedirectView.as_view(url=reverse_lazy('hyperkitty.views.index.index'))),
url(r'^mailman3/', include('postorius.urls')),
url(r'^archives/', include('hyperkitty.urls')),
url(r'', include('social.apps.django_app.urls', namespace='social'), {"SSL": True}),
url(r'', include('django_browserid.urls'), {"SSL": True}),
)
你可以看到 "root" url ("r'^$'") 被设置为重定向到 hyperkitty.views.index.index(hyperkitty 是存档器)
如果您想让根 url 重定向到“/mailman3/”,您必须将第一个 url()
行更改为
url(r'^$',RedirectView.as_view(url="/mailman3/")),
请注意,每次更新包时都必须维护此分支。
注意:有 "better"(更安全/更清洁/更易于维护)的方法来做同样的事情(通过使用您自己的 django 设置模块而不是默认模块并使其成为 ROOT_URL_CONF
点给你的所有者 copy/pasted/edited 版本的这个 urls.py
文件,最后使用适当的 reverse_lazy
而不是硬编码 url),但是如果你对 Django 了解不多上面的(有点 Q&D)解决方案是迄今为止最简单的。