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

сломанный apache .htaccess (mod_rewrite)

Привет, у меня проблема с конфигурацией apache mod_rewrite на одной из наших машин. Кто-нибудь сталкивался / преодолевал какие-либо из этих проблем.

A) файл .htaccess - я пробовал самый простой подход, который работал в локальной среде

 75 # Various rewrite rules.
 76 <IfModule mod_rewrite.c>
 77   RewriteEngine on
 78 
 79   # BEGIN new URL Mapping rules
 80 #RewriteRule ^http://www.uppereast.com/$ http://www.nyclocalliving.com
 ...
 2307 #RewriteRule ^http://www.uppereast.com/zipcodechange.html$ http://www.nyclocalliving.com/zip-code-change

Инжир. 1

Б) файл / var / log / httpd / error_log - там эти сег. ошибки ошибки, когда я включаю первое правило (строка 80). в противном случае нет журналов ошибок.

 1893 [Fri Sep 25 17:53:46 2009] [notice] Digest: generating secret for digest authentication ...
 1894 [Fri Sep 25 17:53:46 2009] [notice] Digest: done
 1895 [Fri Sep 25 17:53:46 2009] [notice] Apache/2.2.3 (CentOS) configured -- resuming normal operations
 1896 [Fri Sep 25 17:53:47 2009] [notice] child pid 29774 exit signal Segmentation fault (11)
 1897 [Fri Sep 25 17:53:47 2009] [notice] child pid 29775 exit signal Segmentation fault (11)
 1898 [Fri Sep 25 17:53:47 2009] [notice] child pid 29776 exit signal Segmentation fault (11)
 1899 [Fri Sep 25 17:53:47 2009] [notice] child pid 29777 exit signal Segmentation fault (11)
 1900 [Fri Sep 25 17:53:47 2009] [notice] child pid 29778 exit signal Segmentation fault (11)
 1901 [Fri Sep 25 17:53:47 2009] [notice] child pid 29779 exit signal Segmentation fault (11)

Инжир. 2

C) Еще немного отладочной информации из оболочки; mod_rewrite включен, и это архитектура машины

 1 # apachectl -t -D DUMP_MODULES | more         
 2 Loaded Modules:
 3  core_module (static)
 4  ...
 5  rewrite_module (shared)

 1 # uname -a
 2 Linux RegionalWeb 2.6.24-23-xen #1 SMP Mon Jan 26 03:09:12 UTC 2009 x86_64 x86_64 x86_64 GNU/Linux

Инжир. 3

Я просмотрел несколько предыдущих постов (.htaccess не работает (mod_rewrite)), но не нашел для этого решения. Я уверен, что где-то есть небольшой переключатель, который мне не хватает.

Заранее спасибо Тим

Я не уверен, почему это будет segfault, но я думаю, вам нужно такое правило, как:

RewriteRule ^zipcodechange.html$ http://www.nyclocalliving.com/zip-code-change [R=301,L]
RewriteRule ^(.*)$ http://www.nyclocalliving.com/$1 [R=301,L]

Первое правило будет специально записывать страницу на вновь созданную страницу и выполнять 301 редирект. Второе правило примет любой запрошенный URL-адрес и перенаправит его на другой сайт с неповрежденной частью URL-адреса. Используйте [R = 301, QSA, L], если у вас есть аргументы на страницах (например, pagename.html? Something = else)

RewriteRule ^http://www.uppereast.com/$ http://www.nyclocalliving.com

В этот момент имя хоста / URL-адрес недоступны. Я не знаю каких-либо проблем с / в правилах, которые могли бы привести к сбою, но я думаю, что два правила выше делают то, что вы намереваетесь. Что касается segfaults, это отдельная тема.

Если предложенные правила работают, я думаю, что что-то в механизме синтаксического анализа mod_rewrite имеет проблемы с //. Если приведенные выше правила по-прежнему вызывают ошибки сегментации, вы можете убедиться, что ваши модули apache и базовая версия совпадают. Возможно, вы перекомпилировали apache поверх предварительно упакованного apache, и ваши параметры компиляции не поместили модули в одно и то же место.

Что касается проблемы с более чем 1000 правилами, Apache должен прочитать файл .htaccess для всего, что обслуживается в текущем каталоге или ниже, если только в одном из подкаталогов нет файла .htaccess и он не содержит инструкции Inherit. Возможно чтение файла размером 70 КБ каждый раз, когда он должен обслуживать страницу / актив, что-то выходит за пределы распределения памяти. Вы также можете поместить эти правила в свою конфигурацию apache.

Начнем с конфигурации вашего apache. Если при запуске правил mod_rewrite возникают ошибки segfaults, значит, что-то не так. Вы используете RPM / DEB-версию Apache? Или это вы сами собрали?

Я бы сначала устранил эту ошибку, прежде чем изучать какие-либо проблемы с вашим синтаксисом, тем более, что он работал на вашем локальном хосте.

Если вам нужно управлять своими правилами на основе имени сервера / имени хоста, вы можете написать такие правила, как

# simple and not really useful
RewriteCond %{HTTP_HOST} ^domain\.com
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

# more useful
RewriteCond %{HTTP_HOST} domainA\.com
RewriteRule ^(.*)$ http://www.domainB.com/$1 [R=301,L]

# or with a more specific match
RewriteCond %{HTTP_HOST} domainA\.com
RewriteRule ^zipcodechange.html$ http://www.domainB.com/zip-code-change [R=301,L]

Также убедитесь, что ваше «общее» правило находится в конце всех конкретных правил ... ,L Параметр означает последнее правило, что означает, что остальная часть .htaccess игнорируется (по крайней мере, для повторной записи).