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

.htaccess игнорируется, КОНКРЕТНО для EC2 - не обычные подозреваемые

Я использую веб-серверы на базе 8-10 EC2, так что мой опыт работы много часов, но ограничен CentOS; в частности, распространение Amazon. Я устанавливаю Apache с помощью yum, поэтому получаю компиляцию Apache по умолчанию от Amazon.

Я хочу реализовать канонические перенаправления с домена без www (голый / корневой) на www.domain.com для SEO с помощью mod_rewrite, НО МОЙ ФАЙЛ .htaccess ПОСТОЯННО ИГНОРИРУЕТСЯ.

Мои шаги по устранению неполадок (изложенные ниже) заставили меня поверить, что это что-то специфическое для сборки Apache от Amazon.

ПРЕЦЕДЕНТ

  1. Запустите экземпляр EC2, например Amazon Linux AMI 2013.03.1
  2. SSH к серверу
  3. Выполните команды:

    • $ sudo yum install httpd
    • $ sudo apachectl start
    • $ sudo vi /etc/httpd/conf/httpd.conf
    • $ sudo apachectl restart
    • $ sudo vi /var/www/html/.htaccess

В httpd.conf я изменил следующее в разделе / ​​области DOCROOT:

AllowOverride All

В .htaccess добавлено:

(РЕДАКТИРОВАТЬ, я добавил RewriteEngine On потом)

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

Разрешения на .htaccess правильные, AFAI может сказать:

$ ls -al /var/www/html/.htaccess -rwxrwxr-x 1 git apache 142 Jun 18 22:58 /var/www/html/.htaccess

Другая информация:

$ httpd -v
Server version: Apache/2.2.24 (Unix)
Server built:   May 20 2013 21:12:45

$ httpd -M
Loaded Modules:
 core_module (static)
     ...
 rewrite_module (shared)
     ...
 version_module (shared)
Syntax OK

ОЖИДАЕМОЕ ПОВЕДЕНИЕ

$ curl -I domain.com
HTTP/1.1 301 Moved Permanently
Date: Wed, 19 Jun 2013 12:36:22 GMT
Server: Apache/2.2.24 (Amazon)
Location: http://www.domain.com/
Connection: close
Content-Type: text/html; charset=UTF-8

АКТУАЛЬНОЕ ПОВЕДЕНИЕ

$ curl -I domain.com
HTTP/1.1 200 OK
Date: Wed, 19 Jun 2013 12:34:10 GMT
Server: Apache/2.2.24 (Amazon)
Connection: close
Content-Type: text/html; charset=UTF-8

ПОИСК НЕИСПРАВНОСТЕЙ

В .htaccess добавлено:

BLAH BLAH BLAH ERROR
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteRule ^/(.*) http://www.domain.com/$1 [R=301,L]

Мой сервер выдал ошибку 500, поэтому я знал, что файл .htaccess был обработан.

Как и ожидалось, он создал запись в журнале ошибок: [Wed Jun 19 02:24:19 2013] [alert] [client XXX.XXX.XXX.XXX] /var/www/html/.htaccess: Invalid command 'BLAH BLAH BLAH ERROR', perhaps misspelled or defined by a module not included in the server configuration


Поскольку у меня есть root-доступ к серверу, я попытался перенести правило перезаписи непосредственно в файл httpd.conf. ЭТО РАБОТАЕТ. Это говорит нам о том, что несколько важных вещей работают.

$ curl -I domain.com
HTTP/1.1 301 Moved Permanently
Date: Wed, 19 Jun 2013 12:36:22 GMT
Server: Apache/2.2.24 (Amazon)
Location: http://www.domain.com/
Connection: close
Content-Type: text/html; charset=UTF-8

ОДНАКО меня беспокоит, что он не работал в файле .htaccess. И у меня есть другие варианты использования, когда мне нужно, чтобы он работал в .htaccess (например, экземпляр EC2 с именованными виртуальными хостами).

Спасибо заранее за вашу помощь.

Вы можете поместить RewriteRules в конфигурацию сервера или в .htaccess. Однако есть различия, которые означают, что правило, работающее в конфигурации сервера, не обязательно будет работать в контексте .htaccess или наоборот. RewriteRules в файлах .htaccess (и контексте каталога) сопоставляются с относительными URL-адресами, поэтому ваше правило, начинающееся с /, никогда не сопоставляется. Включите rewritelog, и вы увидите.

Итак, для asume docroot / var / www, и вы запрашиваете http://myserver.com/foo/bar.html

Правило перезаписи в конфигурации вашего сервера будет сопоставлено с /foo/bar.html

Правило перезаписи в контексте или в файле .htaccess в / var / www / foo будет сопоставляться только с bar.html. Поэтому, если он начинается с /, он никогда не будет совпадать.

Об этом важно знать, и это одна из причин, по которой я обычно считаю перезапись в файлах .htaccess плохой идеей. Обычно я настоятельно не рекомендую перезаписывать файлы .htaccess, если вы можете этого избежать (и у вас есть доступ к httpd.conf, чтобы вы могли). RewriteRules в файлах .htaccess часто затрудняет диагностику поведения и сильно снижает производительность.

См. Также документацию по apache: http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule

"В контексте Directory и htaccess шаблон будет изначально сопоставляться с путем в файловой системе после удаления префикса, который привел сервер к текущему RewriteRule (например," app1 / index.html "или" index.html "в зависимости от того, где находятся директивы определены) ".