【问题标题】:Is it possible to to rewrite the base URL in Sinatra?是否可以在 Sinatra 中重写基本 URL?
【发布时间】:2023-04-07 09:19:01
【问题描述】:

是否可以重写基本 URL?

例如而不是 www.host.com/ 使用 www.host.com/blah/ 作为 一个基本网址等等:

get '/' do
  ...
end

适用于www.host.com/blah/

我可以附加到我所有的路线 '/blah/..' 但任何宝石等。 也将无法工作。

这可以在 Rails 中轻松完成,我也希望在 Sinatra 中使用它。

【问题讨论】:

  • 您使用哪些 gem 来进行重定向?
  • sinatra 身份验证。基本上我也通过 CGI 和那些复杂的东西运行 sinatra。它必须是一个更漂亮的解决方案。我正在考虑使用之前和之后的过滤器。
  • 我不完全确定您要做什么:您应该能够编写您的应用程序,使其独立于基本 url,例如使用url helper。然后应用程序的路径取决于您如何设置服务器,而不是 Sinatra 应用程序本身。宝石也应该可以正常工作。
  • 那么让我澄清一下。我正在使用尚未完全访问的服务器。我被分配了一个目录,我可以通过 CGI 处理我的项目。因此,我收到的是 'foo/blah/',而不是在 sinatra 中收到“/”。 '/about' 变成 '/foo/blah/about' 等等。kfl62 提出了一些好的建议,我已经看过了,但是任何重定向到 '/login' 的 gem 都会失败,因为它们会重定向到 www.host.com/login而不是 www.host.com/foo/blah/login
  • 我用一些例子编辑了我的答案。我仍然相信:rewrite %r{/}, '/foo/blah' 会解决您的问题。

标签: ruby url sinatra rack base


【解决方案1】:

你可以看看https://github.com/josh/rack-mount,也许那个可以帮助你?

【讨论】:

  • 嗯,谢谢,但如果 gem 重定向到“/”,这将不起作用,对吧?
【解决方案2】:

我为此 rack-rewrite 使用了机架中间件,我对此非常满意 :)

    use Rack::Rewrite do
      rewrite %r{^/\w{2}/utils}, '/utils'
      rewrite %r{^/\w{2}/ctrl},  '/ctrl'
      rewrite %r{^/\w{2}/},      '/'
    end

编辑:

不确定我是否理解您的问题,但这里有一个 config.ru 文件

# encoding: utf-8
require './config/trst_conf'
require 'rack-flash'
require 'rack/rewrite'

use Rack::Session::Cookie, :secret => 'zsdgryst34kkufklfSwsqwess'
use Rack::Flash
use Rack::Rewrite do
  rewrite %r{^/\w{2}/auth},  '/auth'
  rewrite %r{^/\w{2}/utils}, '/utils'
  rewrite %r{^/\w{2}/srv},   '/srv'
  rewrite %r{^/\w{2}/},      '/'
end

map '/auth' do
  run TrstAuth.new
end
map '/utils' do
  run TrstUtils.new
end
map '/srv' do
  map '/tsk' do
     run TrstSysTsk.new
  end
  map '/' do
    run TrstSys.new
  end
end
map '/' do
  run TrstPub.new
end

和一个示例 Sinatra::Base 子类

# encoding: utf-8

class TrstAuth < Sinatra::Base

  # Render stylesheets
  get '/stylesheets/:name.css' do
    content_type 'text/css', :charset => 'utf-8'
    sass :"stylesheets/#{params[:name]}", Compass.sass_engine_options
  end

  # Render login screen
  get '/login' do
    haml :"/trst_auth/login", :layout => request.xhr? ? false : :'layouts/trst_pub'
  end

  # Authentication
  post '/login' do
    if user = TrstUser.authenticate(params[:login_name], params[:password])
      session[:user] = user.id
      session[:tasks] = user.daily_tasks
      flash[:msg] = {:msg => {:txt => I18n.t('trst_auth.login_msg'), :class => "info"}}.to_json
      redirect "#{lang_path}/srv"
    else
      flash[:msg] = {:msg => {:txt => I18n.t('trst_auth.login_err'), :class => "error"}}.to_json
      redirect "#{lang_path}/"
    end
  end

  # Logout
  get '/logout' do
    session[:user] = nil
    session[:daily_tasks] = nil
    flash[:msg] = {:msg => {:txt => I18n.t('trst_auth.logout_msg'), :class => "info"}}.to_json
    redirect "#{lang_path}/"
  end

end

也许这有帮助 :) full source on github.

【讨论】:

  • 谢谢你,我已经发现了这个,但是任何重定向到'/login'等看到我上面的评论都会失败。如果我找不到更好的东西并重写任何 gem 的代码,我将使用它:)
【解决方案3】:

before 块中,您可以编辑env['PATH_INFO]`;然后 Sinatra 将使用编辑后的值进行路由。

对于你的例子,这样的事情可能会起作用......

before do
    env['PATH_INFO'].sub!(/^\/blah/, '')
end

我同意其他答案,即使用中间件组件是一种更强大的解决方案,但如果您想要简洁明了的东西,可以在 Sinatra 应用程序中内部工作,而不是通过 config.ru,然后进行修改Rack环境还不错。

【讨论】:

猜你喜欢
  • 2011-03-30
  • 2015-02-15
  • 2012-06-19
  • 2011-06-06
  • 2011-02-26
  • 2010-11-08
  • 2019-03-07
相关资源
最近更新 更多