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

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

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

apache2.conf和httpd.conf

我修改httpd.conf文件看起来像下面。


 #将端口80上的所有http请求转发给tomcat
 ProxyPass / 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文本/ css
 AddOutputFilterByType DEFLATE text / javascript
 AddOutputFilterByType DEFLATE application / xml
 AddOutputFilterByType DEFLATE application / xhtml + xml
 AddOutputFilterByType DEFLATE应用程序/ rss + xml
 AddOutputFilterByType DEFLATE应用程序/ javascript
 AddOutputFilterByType DEFLATE应用程序/ x-javascript
 DeflateCompressionLevel 9
 BrowserMatch ^ Mozilla / 4 gzip-only-text / html
 BrowserMatch ^ Mozilla / 4 \ .0 [678] no-gzip
 BrowserMatch \ bMSIE!no-gzip!gzip-only-text / html


 #打开“过期”并将所有静态内容标记为一周内过期
 #取消最后修改和ETag 
 ExpiresActive On
 ExpiresDefault A0
 (jpg | jpeg | png | gif | js | css | ico)$“>
 过期默认A604800
 标题未设置Last-Modified
 标题未设置ETag
  FileETag无
 标题附加caching控制“max-age = 604800,public”
 </ FilesMatch>

 RewriteEngine On

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

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

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

我想实现以下。

  1. 将所有stream量转发给tomcat
  2. GZIP所有的文字内容。
  3. 将所有静态文件放置1周到期标题,并取消设置ETag /最后修改标题。
  4. 重写所有js和css文件到一定的格式。
  5. 从URL中删除所有查询参数
  6. 将所有www.example.com转发给example.com

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

到期和重写模块是ENABLED。

请让我知道我该怎么做才能解决这个问题。 1.是否需要在httpd.conf文件中添加其他内容(如Options + FollowSymLink)或其他内容? 2.我需要在apache2.conf文件中添加一些东西吗? 3.我是否需要将这些规则移至.htaccess文件? 如果是的话,我应该在那个文件中写什么,我应该在哪里保存这个文件? 在/ etc / apache2 /文件夹或/ var / www /文件夹? 4.任何其他信息,使这项工作?

谢谢,Ankit

你的configuration文件中的ProxyPass /指令可能ProxyPass /所有请求路由到Tomcat后端,绕过所有的mod_rewrite指令。 您可以尝试删除ProxyPass指令,并在其他重写后使用带有[P]标志的RewriteRule

  • mod_rewrite:P |代理

对于过期的标题,情况更糟 – 在另一个类似的问题中找不到解决scheme。

.htaccess文件中使用mod_rewrite将需要Option +FollowSymLinks ; 在你的情况下,它不是必需的,因为你可以把所有东西都放在Apacheconfiguration中。 将规则从configuration移动到.htaccess是毫无意义的,只能使事情变慢。 然而, .htaccess和Apacheconfiguration之间有一个重要的区别 – 在RewriteRule中的.htaccess模式与相对的文件系统path(永远不会以/开头)相匹配,而在VirtualHost上下文中,这些模式匹配URLpath主机名,始终以/开头。 因此,至less有一个规则是不正确的:

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

应该

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

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

你应该改变规则如下:

 #is the path correct? your comment stats something else RewriteRule ^/content/(js|css)/([az]+)-([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] 

获取更多信息,看看这个指令和以下内容。 启用日志logging后,再试一遍,看看日志。

你有没有检查你的正则expression式和你的文件的情况是否匹配?