我有一个通过 Passenger (mod_rails) 提供的 rails 应用程序,我希望它有一个规范的 URL。
我希望所有请求都发送到http://我的域名.com(因此,重写http://www.mydomain.com到http://我的域名.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 使用单独的虚拟主机,只需对 mydomain.com 进行重写即可。Passenger 与 mod_rewrite 配合得不好。
希望这可以帮助。
答案2
更新:显然我运行的是旧版本的 Passenger(不知道我怎么会错过它)。我目前正在运行 Passenger 2.2.9,将原始重写放入虚拟主机中可以按预期(和期望)工作!
Google 小组讨论了针对旧版本 Passenger 的解决方法: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原始帖子对于此代码)