Переписывание канонического Apache с помощью Passenger (mod_rails)

Переписывание канонического Apache с помощью Passenger (mod_rails)

У меня есть приложение Rails, обслуживаемое через Passenger (mod_rails), и мне нужно, чтобы у него был канонический URL.

Я хочу, чтобы все запросы направлялисьhttp://mydomain.com(так что перепишитеhttp://www.mydomain.comкhttp://mydomain.com).

В других моих приложениях, не использующих Rails, я делаю это с помощью mod_rewrite и файла .htaccess следующим образом:

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

Однако, похоже, это не работает с Passenger. Я пробовал всевозможные комбинации размещения файла .htaccess (в публичном каталоге) и перемещения директив (в конфигурации vhost), но я не могу заставить это работать.

Как мне этого добиться?

решение1

Попробуйте заменить последнюю строку следующим:

Правило перезаписи ^(.*)http://mydomain.com%{REQUEST_URI} [R=постоянный,QSA,L]

Если это все еще не помогает, я рекомендую использовать отдельный виртуальный хост для URL www.mydomain.com, который просто выполняет Rewrite на mydomain.com. Passenger плохо работает с mod_rewrite.

Надеюсь это поможет.

решение2

ОБНОВЛЕНИЕ: Видимо, я использовал старую версию Passenger (не знаю, как я это пропустил). Сейчас я использую Passenger 2.2.9, и размещение оригинальной перезаписи в vhost работает так, как и ожидалось (и хотелось)!

Обсуждение в группе Google обходных путей для старых версий Passenger:http://groups.google.com/group/phusion-passenger/browse_thread/thread/5e019e5d65beb54f

Для более старых версий:

Размещайте wwwкак отдельный виртуальный хост и перенаправляйте (предложение Джонатана Кларка)

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

Выполните переписывание в приложении:

# 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 

(Реквизиты RSL воригинальный постдля этого кода)

Связанный контент