我有一個透過 Passenger (mod_rails) 提供服務的 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 檔案(在公共目錄中)和移動指令(在虛擬主機配置中)的各種組合,但我無法讓它工作。
我怎樣才能做到這一點?
答案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 的支持原帖對於此程式碼)