【问题标题】:OpenShift, python 2.7 and static files with htaccessOpenShift、python 2.7 和带有 htaccess 的静态文件
【发布时间】:2014-09-18 12:30:32
【问题描述】:

我正在尝试将 apache 配置为为 site.com/img/bla.jpg 等 URL 提供静态文件。 Python 墨盒 + 烧瓶。

我知道wsg/static 目录有一个预配置的别名,所以我们可以使用site.com/static/bla.jpg。但我需要额外的静态目录。

项目结构:

/wsgi
  .htaccess
  /img -> $OPENSHIFT_DATA_DIR/some/path (soft link)
  /static
  application

在后端我绑定了mysite.com/img/<filename> 以测试 apache 或后端是否处理文件 - 它返回 "ok [filename]" 字符串。

我在 htaccess 中尝试了以下配置:

1site.com/img/1.jpg -> "ok 1.jpg"

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f  # with and without this condition
RewriteRule ^img/(.+)$ /static/$1 [L]
# RewriteRule ^img/(.+)$ /img/$1 [L]
# RewriteRule ^/img/(.+)$ /img/$1 [L]
# RewriteRule ^img/(.+)$ https://ssl.gstatic.com/gb/images/i1_3d265689.png [L]

据我了解,正则表达式与请求 URL 不匹配,而 apache 只是将内容传递给后端?

2site.com/img/1.jpg -> "ok 1.jpg"

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule /img/1.jpg https://ssl.gstatic.com/gb/images/i1_3d265689.png [L]

3site.com/img/1.jpg -> 打开 google 的 i1_3d265689.png

RewriteEngine On
RewriteBase /
RewriteRule /img/1.jpg https://ssl.gstatic.com/gb/images/i1_3d265689.png [L]

注意:没有 RewriteCond。

那么如何让它发挥作用呢?

我再次希望 apache 将 mysite.com/img/<filename> 服务为 wsg/img/<filename>

openshift 有什么问题还是我错过了什么?

【问题讨论】:

    标签: python apache .htaccess openshift


    【解决方案1】:

    看来我想通了。问题分两步解决:

    1. 如果您希望 apache 为您(而不是您的后端脚本)提供静态文件,则必须将所有静态文件放入 wsgi/static。您不能将 apache 配置为使用另一个目录,因为您只能使用 .htaccess 文件进行操作,而不允许配置此类内容。所以我不能让 apache 提供来自wsgi/img$OPENSHIFT_DATA_DIR/img 的资产。 我必须为wsgi/static 中的那些目录创建符号链接,例如:

      /wsgi
          /static
              /img -> (symlink) $OPENSHIFT_DATA_DIR/img
      

      现在我们可以通过site.com/static/img/1.jpg访问图片了。

    2. 现在我们需要将site.com/static/img/1.jpg 映射到wsgi/.htaccess 中的site.com/img/1.jpg。比如:

      RewriteRule ^img/(.+)$ /static/img/$1 [L]
      or
      RewriteRule ^/img/(.+)$ /static/img/$1 [L]
      

      它不会起作用,因为正则表达式强制从 URL 路径 (^) 的开头进行搜索。 问题是 OpenShift 的 apache URL 路径是 <wsgi app name>/%{REQUEST_URI}(至少对于 RewriteRule)。 application/img/1.jpg 在我的情况下。因此,^img/(.+)$^/img/(.+)$ 都不会匹配 URL 路径。我不是 apache 专家,但可能带有模板配置的 this link 可以帮助某人找出 URL 路径问题。 所以解决办法是去掉^:

      RewriteRule /img/(.+)$ /static/img/$1 [L]
      

      现在我们可以使用site.com/img/1.img,但site.com/randomstuff/img/1.img 也可以使用。所以我使用RewriteCond来过滤这样的URL。

    这是我的最终解决方案:

    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/img/
    RewriteRule /img/(.+)$ /static/img/$1 [L]
    

    【讨论】:

    • 谢谢,你让我开心。我用这个把头撞在墙上。
    猜你喜欢
    • 2014-05-09
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 2014-06-03
    • 2014-08-15
    • 2014-08-27
    • 1970-01-01
    • 2013-06-23
    相关资源
    最近更新 更多