Назад | Перейти на главную страницу

Apache2 - mod_expire и mod_rewrite не работают в httpd.conf - обслуживание контента из tomcat

Я использую сервер apache2, работающий на debian, который перенаправляет весь HTTP-запрос на tomcat, установленный на том же компьютере.

У меня есть два файла в папке / etc / apache2 /

apache2.conf и httpd.conf

Я изменил файл httpd.conf, чтобы он выглядел следующим образом.


# forward all http request on port 80 to tomcat
ProxyPass / ajp://127.0.0.1:8009/
ProxyPassReverse / ajp://127.0.0.1:8009/

# gzip text content
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/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


# Turn on Expires and mark all static content to expire in a week
# unset last modified and ETag 
ExpiresActive On
ExpiresDefault A0
<FilesMatch "\.(jpg|jpeg|png|gif|js|css|ico)$">
 ExpiresDefault A604800
 Header unset Last-Modified
 Header unset ETag
 FileETag None
 Header append Cache-Control "max-age=604800, public"
</FilesMatch>

RewriteEngine On

# rewrite all www.example.com/content/XXX-01.js and YYY-01.css files to XXX.js and YYY.css
RewriteRule ^content/(js|css)/([a-z]+)-([0-9]+)\.(js|css)$ /content/$1/$2.$4

# remove all query parameters from URL after we are done with it
RewriteCond %{THE_REQUEST} ^GET\ /.*\;.*\ HTTP/
RewriteCond %{QUERY_STRING} !^$
RewriteRule .* http://example.com%{REQUEST_URI}? [R=301,L]

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

Хочу добиться следующего.

  1. перенаправить весь трафик на tomcat
  2. GZIP все текстовое содержимое.
  3. Поместите заголовок истечения срока действия 1 неделя во все статические файлы и отключите заголовок ETag / last измененный.
  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. Есть ли еще информация для работы?

Спасибо, Анкит

Наверное, ProxyPass / Директива, которая есть в вашей конфигурации, направляет все запросы в серверную часть Tomcat, минуя все ваши директивы mod_rewrite. Вы можете попробовать удалить ProxyPass директива и использование RewriteRule с [P] флаг после других ваших перезаписей:

Для заголовков expire ситуация еще хуже - в еще один похожий вопрос решение не найдено.

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

(обратите внимание на дополнительную косую черту в начале).

imo вы должны изменить правила следующим образом:

#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]

чтобы получить больше информации, взгляните на этот директива и следующее. после включения ведения журнала попробуйте все это еще раз и посмотрите журналы.

Вы проверили, совпадают ли регистр вашего регулярного выражения и регистр ваших файлов?