将别名添加到 Apache2 配置文件时出错

Error when adding Alias to Apache2 config file

我正在使用 Webfaction 托管我的一个 Django Web 应用程序。我一直在使用符号 link 应用程序来为我的媒体提供服务。最近我一直在尝试设置一个 .htaccess 文件来为我所有的图像设置过期 headers,但是 .htaccess 文件没有用。我联系了 Webfaction 支持,他们这样回复:

“您没有在您的文件中看到过期标记,因为您没有从您的 Apache 堆栈中提供像 feature_homemobile_fieldagent.jpg 这样的文件。[=33= 下的所有内容]/ 目录由我们的前端 nginx 服务器在您位于 https://my.webfaction.com/applications/971721/edit-application 的 symlink 应用程序之后提供服务。由于我们的 nginx 服务器不知道您的设置,因此不会设置此类标签。 如果你想这样做,你将需要删除 symlink 应用程序并使用正确的别名和位置节更新你的 httpd.conf。或者构建和配置您自己的 nginx 服务器,您可以完全控制其配置。"

我试图将新别名添加到我的 Apache2 配置文件中,但出现此错误

Invalid command 'Allow', perhaps misspelled or defined by a module not included in the server configuration

更新

我发现在 Apache2.4 上意味着它不再是 'Allow from all',现在是 'Require all granted'。我重置了我的服务器,一切都很顺利,我通过 Webfaction 暂时从我的网站上删除了我的 Symlink 应用程序。所有图像都停止提供服务,并停止出现在我的网站上。我等了 10 分钟,但没有任何变化。我是否缺少一些额外的步骤?

Apache2 httpd.conf

ServerRoot "/home/doc4design/webapps/django_2016/apache2"

LoadModule authz_core_module modules/mod_authz_core.so
LoadModule dir_module        modules/mod_dir.so
LoadModule env_module        modules/mod_env.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module       modules/mod_mime.so
LoadModule rewrite_module    modules/mod_rewrite.so
LoadModule setenvif_module   modules/mod_setenvif.so
LoadModule wsgi_module       modules/mod_wsgi.so
LoadModule unixd_module      modules/mod_unixd.so
LoadModule headers_module    modules/mod_headers.so
LoadModule expires_module    modules/mod_expires.so
LoadModule filter_module     modules/mod_filter.so
LoadModule deflate_module    modules/mod_deflate.so
#LoadModule pagespeed_module  modules/mod_pagespeed_ap24.so

<Directory /home/doc4design/webapps/django_2016/doc4_2016>
   AllowOverride All
</Directory>

Alias /media/ /home/doc4design/webapps/django_2016/doc4_2016/media

<Directory /home/doc4design/webapps/django_2016/doc4_2016/media>
Allow from all
</Directory>

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog /home/doc4design/logs/user/access_django_2016.log combined
ErrorLog /home/doc4design/logs/user/error_django_2016.log

Listen 30651
KeepAlive Off
SetEnvIf X-Forwarded-SSL on HTTPS=1
ServerLimit 1
StartServers 1
MaxRequestWorkers 5
MinSpareThreads 1
MaxSpareThreads 3
ThreadsPerChild 5

WSGIDaemonProcess django_2016 processes=2 threads=12 maximum-requests=100 python-path=/home/doc4design/webapps/django_2016:/home/doc4design/webapps/django_2016/doc4_2016:/home/doc4design/webapps/django_2$
WSGIProcessGroup django_2016
WSGIRestrictEmbedded On
WSGILazyInitialization On
WSGIScriptAlias / /home/doc4design/webapps/django_2016/doc4_2016/webapp/wsgi.py

我看你还在战斗

注意: 对于 HTTP 缓存 headers 您可以指定 expires max, when you create a Webfaction Static app [oficial Webfaction docs]。但是 expires max 很棘手,因为它会在未来很长一段时间内设置到期日期,您将无法告诉客户端浏览器文件已更改。您必须重命名文件 (imageV1.jpg)...

Webfaction support should be able to set it for you 如果您已经创建了静态应用程序(不是符号链接应用程序)。

您应该能够使用自己的 apache 实例提供静态服务。您正确地提到,对于 Apache 2.4,您需要设置 Require all granted,但是在您的 httpd.conf 中,我可以看到您仍在使用 Allow from all.

使用 Apache 2.4 为 Django 应用程序提供服务所需部分的简化表示是:

Alias /media/ /path/to/mysite.com/media/
Alias /static/ /path/to/mysite.com/static/

<Directory /path/to/mysite.com/static>
Require all granted
</Directory>

<Directory /path/to/mysite.com/media>
Require all granted
</Directory>

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py

<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

您还可以从官方 Django 文档中查看 Django Apache Serving Files

我在服务静态资产时遇到的一个特定 webfaction 问题是权限问题。

转到www.yoursite.com/media/file.jpg
当您尝试访问图像时收到什么 HTTP 错误代码?
如果你得到 403,试试这个:

chmod 710 $HOME/webapps/django_2016/doc4_2016/media/file.jpg
setfacl -m u:apache:r-x $HOME/webapps/django_2016/doc4_2016/media/file.jpg

祝你好运!