apache quebrado .htaccess (mod_rewrite)

1

Olá, estou correndo em um problema de configuração do apache mod_rewrite em uma de nossas máquinas. Alguém já encontrou / superou qualquer um desses problemas?

  • O URL1 ( link ) não está sendo redirecionado para o URL2 ( link ). Isso definitivamente funcionou no meu ambiente de teste, onde um endereço de host local foi reescrito para URL2 (RewriteRule ^ link $ link ).

  • Estou tentando fazer com que todas as regras de redirecionamento funcionem (2200+), mas o site " link " encontra um erro no servidor se eu usar mais que 1000 ou mais regras.

A). arquivo .htaccess - Eu tentei a abordagem mais simples que funcionava em um ambiente local

 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

fig. 1

B) / var / log / httpd / arquivo error_log - existem esses seg. erros de falha quando eu habilito a primeira regra (linha 80). nenhum erro registra de outra maneira.

 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)

fig. 2

C) Mais algumas informações de depuração do shell; o mod_rewrite está ligado e esta é a arquitetura da máquina

 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

fig. 3

Eu examinei algumas postagens anteriores ( .htaccess não funciona (mod_rewrite) ), mas não encontrou uma solução para isso. Tenho certeza que há um pequeno interruptor em algum lugar que eu estou sentindo falta.

Obrigado antecipadamente Tim

    
por Community 26.09.2009 / 00:07

3 respostas

1

Vamos começar com sua configuração do Apache. Se você está recebendo segfaults quando regras mod_rewrite começam, algo não está funcionando corretamente. Você está executando uma versão RPM / DEB do Apache? Ou isso é algo que você mesmo compilou?

Eu solucionaria esse erro antes de analisar qualquer problema com sua sintaxe, especialmente porque ele funcionava no seu host local.

    
por 30.09.2009 / 14:54
1

Não sei por que motivo seria segmentado, mas acho que você quer uma regra como:

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

A primeira regra gravará especificamente a página na página recém-criada e fará um redirecionamento 301. A segunda regra terá o URL solicitado e redirecionará para outro site com a parte da página intacta. Use [R = 301, QSA, L] se você tiver argumentos nas páginas (por exemplo, pagename.html? Something = else)

RewriteRule ^ link $ link

O nome do host / URL não está disponível nesse ponto. Eu não sei de nenhum problema com / nas regras que causariam isso, mas acho que as duas regras acima fazem o que você pretende. Quanto aos segfaults, essa é uma questão separada.

Se as regras sugeridas funcionarem, acho que algo no mecanismo de análise mod_rewrite deve estar tendo problemas com o //. Se as regras acima ainda causarem os segfaults, talvez você queira certificar-se de que os módulos do apache e a versão base correspondam. Talvez você tenha recompilado o apache por cima do apache pré-empacotado e suas opções de compilação não colocaram os módulos no mesmo lugar.

Quanto ao problema com mais de 1000 regras, o Apache deve ler o arquivo .htaccess para tudo que estiver no diretório atual ou abaixo, a menos que haja um arquivo .htaccess em um dos subdiretórios e não contenha uma instrução Herdar. É possível ler um arquivo de 70k cada vez que ele deve servir uma página / ativo, algo está ultrapassando uma alocação de memória. Você pode colocar essas regras em sua configuração do apache também.

    
por 08.04.2010 / 09:17
1

Se você precisa controlar suas regras com base no servername / hostname, você pode escrever regras como

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

Certifique-se também de que sua regra "catchall" esteja no final de todas as regras específicas ... a opção ,L significa Última Regra, o que significa que o resto do .htaccess é ignorado (pelo menos para rewite).

    
por 08.06.2010 / 23:27