У меня есть приложение 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 воригинальный постдля этого кода)