Apache Canonical 使用 Passenger 重寫 (mod_rails)

Apache Canonical 使用 Passenger 重寫 (mod_rails)

我有一個透過 Passenger (mod_rails) 提供服務的 Rails 應用程序,我想要一個規範的 URL。

我希望所有請求都轉到http://mydomain.com(所以,重寫http://www.mydomain.comhttp://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 檔案(在公共目錄中)和移動指令(在虛擬主機配置中)的各種組合,但我無法讓它工作。

我怎樣才能做到這一點?

答案1

試著用以下內容取代最後一行:

重寫規則 ^(.*)http://mydomain.com%{REQUEST_URI} [R=永久、QSA、L]

如果仍然失敗,我建議對 URL www.mydomain.com 使用單獨的虛擬主機,該虛擬主機僅對 mydomain.com 進行重寫。 Passenger 不能很好地使用 mod_rewrite。

希望這可以幫助。

答案2

更新:顯然我正在運行舊版本的 Passenger (不知道我是如何錯過的)。我目前正在運行 Passenger 2.2.9 並將原始重寫放入虛擬主機中,按預期(和期望)工作!

關於舊版 Passenger 解決方法的 Google 小組討論:http://groups.google.com/group/phusion-passenger/browse_thread/thread/5e019e5d65beb54f

對於舊版本:

將其託管www為單獨的虛擬主機並重定向(Jonathan Clarke 的建議)

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 的支持原帖對於此程式碼)

相關內容