Apache2 - mod_expire 和 mod_rewrite 在 httpd.conf 中不起作用 - 从 tomcat 提供内容

Apache2 - mod_expire 和 mod_rewrite 在 httpd.conf 中不起作用 - 从 tomcat 提供内容

我正在使用在 debian 上运行的 apache2 服务器,它将所有 http 请求转发到安装在同一台机器上的 tomcat。

我的 /etc/apache2/ 文件夹下有两个文件

apache2.conf 和 httpd.conf

我修改了 httpd.conf 文件使其如下所示。

# 将端口 80 上的所有 http 请求转发到 tomcat
代理密码 / ajp://127.0.0.1:8009/
ProxyPassReverse / ajp://127.0.0.1:8009/

# gzip 压缩文本内容
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE 应用程序/xml
AddOutputFilterByType DEFLATE 应用程序/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE 应用程序/javascript
AddOutputFilterByType DEFLATE 应用程序/x-javascript
放气压缩等级 9
浏览器匹配 ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html


# 开启过期功能,标记所有静态内容在一周内过期
# 取消设置上次修改时间和 ETag
到期日期
到期默认 A0
<FilesMatch "\.(jpg|jpeg|png|gif|js|css|ico)$">
 到期默认 A604800
 标头未设置 Last-Modified
 标头未设置 ETag
 FileETag 无
 标头附加 Cache-Control“max-age=604800,public”
</文件匹配>

重写引擎开启

# 将所有 www.example.com/content/XXX-01.js 和 YYY-01.css 文件重写为 XXX.js 和 YYY.css
重写规则 ^content/(js|css)/([az]+)-([0-9]+)\.(js|css)$ /content/$1/$2.$4

# 完成后从 URL 中删除所有查询参数
RewriteCond %{THE_REQUEST} ^GET\ /.*\;.*\ HTTP/
重写条件 %{QUERY_STRING} !^$
重写规则 .* http://example.com%{REQUEST_URI}? [R=301,L]

# 将 www.example.com 全部重写为 example.com
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
重写规则 ^(.*)$ http://example.com/$1 [R=301,L]

我想实现以下目标。

  1. 将所有流量转发到 tomcat
  2. 对所有文本内容进行 GZIP 压缩。
  3. 将 1 周的有效期标头添加到所有静态文件并取消设置 ETag/last modified 标头。
  4. 将所有 js 和 css 文件重写为特定格式。
  5. 从 URL 中删除所有查询参数
  6. 将 www.example.com 全部转发至 example.com

问题是只有 1 和 2 有效。我尝试了很多组合,但过期和重写规则 (3-6) 根本不起作用。我还尝试将这些规则移动到 apache2.conf 和 .htaccess 文件,但也没有用。它没有给出任何错误,但这些规则被简单地忽略了。

过期和重写模块已启用。

请告诉我该如何修复此问题。1. 我是否需要在 httpd.conf 文件中添加其他内容(如 Options +FollowSymLink)或其他内容?2. 我是否需要在 apache2.conf 文件中添加内容?3. 我是否需要将这些规则移至 .htaccess 文件?如果是,我应该在该文件中写入什么内容,该文件应保存在哪里?在 /etc/apache2/ 文件夹还是 /var/www/ 文件夹中?4. 还有其他信息可以使其正常工作吗?

谢谢,Ankit

答案1

您的配置中的指令可能ProxyPass /将所有请求路由到 Tomcat 后端,从而绕过所有 mod_rewrite 指令。您可以尝试删除该ProxyPass指令并在其他重写后使用RewriteRule该标志:[P]

对于过期标头,情况更糟——另一个类似的问题未找到解决方案。

Option +FollowSymLinks在文件中使用 mod_rewrite 时需要.htaccess;而您不需要,因为您可以将所有内容放入 Apache 配置中。将规则从配置移动到是.htaccess没有意义的,只会使速度变慢。但是,.htaccess和 Apache 配置之间存在一个重要区别 — 在.htaccess中的模式RewriteRule与相对文件系统路径(从不以 开头)匹配/,而在上下文中,VirtualHost这些模式与主机名后的 URL 路径匹配,该路径始终以 开头/。因此,您的规则中至少有一条不正确:

RewriteRule ^content/(js|css)/([a-z]+)-([0-9]+)\.(js|css)$ /content/$1/$2.$4

应该

RewriteRule ^/content/(js|css)/([a-z]+)-([0-9]+)\.(js|css)$ /content/$1/$2.$4

(请注意开头的附加斜线)。

答案2

我认为你应该将规则更改如下:

#is the path correct? your comment stats something else
RewriteRule ^/content/(js|css)/([a-z]+)-([0-9]+)\.(js|css) /content/$1/$2.$4

# rewrite all www.example.com to example.com
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^/(.*) http://example.com/$1 [R=301,L]

要获取更多信息,请查看指令和以下内容。启用日志记录后,再次尝试并查看日志。

您是否检查过正则表达式的大小写和文件的大小写是否匹配?

相关内容