是否可以重写基本网址?
E.g。而不是www.host.com/
使用www.host.com/blah/
一个基本网址,所以:
get '/' do
...
end
适用于www.host.com/blah/
我可以附加到我的所有路线'/blah/..'
但是任何宝石等。
也不会起作用。
这可以在Rails中轻松完成,我也想在Sinatra中使用它。
答案 0 :(得分:7)
我为这个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。
答案 1 :(得分:2)
在before
块中,您可以修改env['PATH_INFO
]`;然后,Sinatra将使用编辑后的值进行路由。
对于你的例子,像这样的东西可能有用......
before do
env['PATH_INFO'].sub!(/^\/blah/, '')
end
我同意其他答案,使用中间件组件是一个更强大的解决方案,但如果你想要简洁明了的东西,那么在里面的Sinatra app而不是config.ru
,然后改变Rack环境也不错。
答案 2 :(得分:1)
您可以查看https://github.com/josh/rack-mount,也许可以帮助您解决问题?