Apache Canonical 使用 Passenger 进行重写(mod_rails)

Apache Canonical 使用 Passenger 进行重写(mod_rails)

我有一个通过 Passenger (mod_rails) 提供的 rails 应用程序,我希望它有一个规范的 URL。

我希望所有请求都发送到http://我的域名.com(因此,重写http://www.mydomain.comhttp://我的域名.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原始帖子对于此代码)

相关内容