我们使用 apache、mod_php 和 mod_wsgi 来为中央 wordpress 站点提供服务,而一些路径则由 Django 提供支持,例如这些页面可能由 Wordpress 提供支持:
oursite.com/
oursite.com/video/
但这些 URL 可能是由 Django 支持的:
oursite.com/our-cool-django-app/
oursite.com/schedule/
目前,我们使用一长串 WSGIScriptAlias 将特定路径映射到 Django。这很烦人,而且很费力。
那么,有没有办法我们可以配置如下内容:
- 其中一个会首先尝试处理 URL(我不太担心)
- 如果该处理程序返回 404,请尝试另一个
我对 Apache 解决方案特别感兴趣,但也会考虑其他替代方案。
答案1
这是对您对替代方案的娱乐的回应。
我在同一个域上托管了 Django 和 WordPress,使用 Nginxphp5-fpm
来托管 WordPress,并依赖Nginx 的X-Accel-Redirect
返回未定义的 URL 到 WordPress上游。
Nginx 配置从 WordPress 应处理的已知模式开始:索引页、一些顶级内容页或顶级部分,以及/或博客文章的模式。这意味着大多数 WordPress URL 都可以用十几个或更少的 URL 模式捕获。
其余一切都路由至 Django 上游。
那么 WordPress 网站的新页面或更改怎么办?Django 应用不会更新每个添加的 WordPress 页面或部分的 URL 模式,而是使用自定义 404 处理程序将请求重定向到 WordPress 上游。
def page_not_found(request):
"""
A 404 view that redirects to the WordPress installation.
"""
try:
new_url = Redirect.objects.get(old_path=request.get_full_path())
except Redirect.DoesNotExist:
pass
else:
return redirect(new_url.new_path)
if not settings.WORDPRESS_REDIRECT:
return render(request, "404.html", {})
response = HttpResponse()
response['X-Accel-Redirect'] = '/wordpress/'
return response
通过重定向请求,重定向中间件将不会“看到”任何 404 错误,因此如果您想使用重定向功能,则应在此处添加。该/wordpress/
位置定义为 Nginx 配置中的内部位置。
location /wordpress/ {
internal;
try_files $uri $uri/ /index.php;
}
我写了一些关于使用X-Accel-Redirects 用于此目的,尽管我认识到这并没有回答具体问题。
希望它能给你一些想法,你可以使用X-Sendfile
mod_php
与和做类似的事情mod_wsgi
。
答案2
读:
使用 AddHandler/mod_rewrite 方法。
如果由于没有相应的 .php 文件而导致 PHP 应用程序无法处理某个 URL,则该 URL 将转交给 WSGI 应用程序。