我使用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和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 :
对于过期的标题,情况更糟 – 在另一个类似的问题中找不到解决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式和你的文件的情况是否匹配?