Reescrita canônica do Apache com passageiro (mod_rails)

Reescrita canônica do Apache com passageiro (mod_rails)

Eu tenho um aplicativo Rails servido via Passenger (mod_rails) que desejo ter uma URL canônica.

Quero que todos os pedidos sejam direcionadoshttp://meudominio.com(então, reescrevahttp://www.meudominio.comparahttp://meudominio.com).

Em meus outros aplicativos não Rails, faço isso usando mod_rewrite e um arquivo .htaccess com o seguinte:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^(.+)mydomain\.com$ [NC]
RewriteRule ^(.*)$ http://mydomain.com/$1 [R=301,L]

No entanto, isso não parece funcionar com o Passenger. Eu tentei todos os tipos de combinações de colocar o arquivo .htaccess (no diretório público) e mover as diretivas (na configuração do vhost), mas não consigo fazer isso funcionar.

Como posso fazer isso?

Responder1

Tente substituir a última linha pelo seguinte:

ReescreverRegra ^(.*)http://meudominio.com%{REQUEST_URI} [R=permanente,QSA,L]

Se isso ainda falhar, recomendo usar um host virtual separado para o URL www.meudominio.com que apenas reescreve para meudominio.com. O passageiro não funciona bem com mod_rewrite.

Espero que isto ajude.

Responder2

ATUALIZAÇÃO: Aparentemente eu estava executando uma versão mais antiga do Passenger (não sei como perdi isso). Atualmente estou executando o Passenger 2.2.9 e colocar a reescrita original no vhost funciona conforme esperado (e desejado)!

Discussão em grupo do Google sobre soluções alternativas para versões mais antigas do Passenger:http://groups.google.com/group/phusion-passenger/browse_thread/thread/5e019e5d65beb54f

Para versões mais antigas:

Hospede wwwcomo um vhost separado e redirecione (sugestão de Jonathan Clarke)

RedirectMatch 301 ^(.*)$ http://mydomain.com$1

Faça a reescrita no aplicativo:

# before_filter :trim_www 
def trim_www 
  if request.subdomains.first == "www" 
    if request.subdomains == ["www"] 
      redirect_to "#{request.protocol}#{request. 
domain}#{request.port_string}#{request.path}" 
    else 
      subdomains = request.subdomains.shift.join(".") 
      subdomains << "." unless subdomains.blank? 
      redirect_to 
"#{request.protocol}#{subdomains}#{request.domain}#{request.port_string}#{r equest.path}" 
    end 
  end 
end 

(Adereços para RSL nopostagem originalpara este código)

informação relacionada