我正在使用在 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]
我想实现以下目标。
- 将所有流量转发到 tomcat
- 对所有文本内容进行 GZIP 压缩。
- 将 1 周的有效期标头添加到所有静态文件并取消设置 ETag/last modified 标头。
- 将所有 js 和 css 文件重写为特定格式。
- 从 URL 中删除所有查询参数
- 将 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]
要获取更多信息,请查看这指令和以下内容。启用日志记录后,再次尝试并查看日志。
您是否检查过正则表达式的大小写和文件的大小写是否匹配?