【问题标题】:Acache: wsgi and alias incompatibilityAcache:wsgi 和别名不兼容
【发布时间】:2016-10-10 09:58:04
【问题描述】:

我正在尝试设置 Apache,以便:

  • 如果用户转到/temp,则提供文件/home/temp/public_html/index.html
  • 如果用户转到/temp/app,那么我的 mod-wsgi /home/temp/app/start.wsgi 会被执行

我目前有这个:

<VirtualHost *:80>
    WSGIDaemonProcess temp user=temp group=temp home=/home/temp/app
    WSGIScriptAlias /temp/app /home/temp/app/start.wsgi
    Alias /temp /home/temp/public_html

    <Directory /home/temp/app>
        WSGIProcessGroup temp
        WSGIApplicationGroup %{GLOBAL}
        Require all granted
    </Directory>
</VirtualHost *:80>

但奇怪的是Alias 似乎优先于WSGIScriptAlias/temp/app 不起作用...

【问题讨论】:

  • 首先,阅读modwsgi.readthedocs.io/en/develop/user-guides/… 由于Apache 强制执行的优先顺序,您不能在所需的特定场景中使用WSGIScriptAlias,但需要使用AliasAddHandler用于 WSGI 应用程序。
  • @GrahamDumpleton 谢谢:) 仍然没有雪茄...即使在WSGIScriptAlias 之后定义Alias,我的/temp/app 也不起作用。我已经更新了我的帖子...
  • 顺便说一句,我已经能够使用AddHandler 使其工作。问题是我似乎需要使用Rewrite 来摆脱 .wsgi 扩展名。我宁愿只使用WSGIScriptAlias...

标签: apache mod-wsgi mod-alias


【解决方案1】:

您在自己的答案中更接近了,但并不完全。使用类似的东西:

<VirtualHost *:80>
    WSGIDaemonProcess temp user=temp group=temp home=/home/temp/app
    Alias /temp/app /home/temp/app/start.wsgi
    Alias /temp /home/temp/public_html

    <Directory /home/temp/app>
        WSGIProcessGroup temp
        WSGIApplicationGroup %{GLOBAL}
        Require all granted

        Options ExecCGI
        AddHandler wsgi-script .wsgi
    </Directory>
</VirtualHost>

【讨论】:

  • 这可以在没有隐藏扩展的所有黑客的情况下工作,因为 Alias 会处理这个问题。简单而精彩!非常感谢!
【解决方案2】:

不是特别漂亮,但我(至少暂时)是这样解决的:

<VirtualHost *:80>
  WSGIDaemonProcess temp user=temp group=temp home=/home/temp/app
  <Directory /home/temp/app>
    WSGIProcessGroup temp
    WSGIApplicationGroup %{GLOBAL}

    Options ExecCGI MultiViews
    MultiviewsMatch Handlers
    AddHandler cgi-script .cgi
    AddHandler wsgi-script .wsgi

    Require all granted
  </Directory>

  Alias /temp /home/temp/app
</VirtualHost>

我没有使用WSGIScriptAlias,而是将其定义为自动运行.wsgi 文件。 MultiViews 选项匹配 filefile.wsgi

此外,要从我自己的脚本中隐藏扩展名,在每个 .wsgi 中我必须重新定义脚本文件名:

from server_public import app as _application  # my flask app
# get rid of the .wsgi extension
def application(environ, start_response):
    if environ['SCRIPT_NAME'].endswith('.wsgi'):
        environ['SCRIPT_NAME'] = environ['SCRIPT_NAME'][:-5]
    return _application(environ, start_response)

我还必须将我的 public_html/index.html 移动到 app/index.html


我更喜欢更简单的解决方案,我为/temp 提供index.html,为/temp/app 提供一个脚本别名...但不确定是否可行...

【讨论】:

    猜你喜欢
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 2021-06-25
    • 2017-04-06
    • 2014-03-12
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多