Привет, у меня проблема с конфигурацией apache mod_rewrite на одной из наших машин. Кто-нибудь сталкивался / преодолевал какие-либо из этих проблем.
URL1 ( http://www.uppereast.com ) не перенаправляется на URL2 ( http://www.nyclocalliving.com ). Это определенно сработало в моей тестовой среде, где адрес localhost был переписан на URL2 (RewriteRule ^http: //upe.localhost$ http://www.nyclocalliving.com ).
Я пытаюсь заставить работать все правила перенаправления (2200+), но 'http://www.nyclocalliving.com'сайт обнаруживает ошибку сервера, если я использую более 1000 или более правил.
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 игнорируется (по крайней мере, для повторной записи).