Вы правы, что Rack::URLMap
не трактует '*'
в пути как подстановочный знак. Фактический перевод от пути к регулярному выражению выглядит так:
Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", nil, 'n')
То есть он обрабатывает любые символы в пути как литералы, но также сопоставляет путь с любым суффиксом. Я полагаю, что единственный способ выполнить то, что вы пытаетесь сделать, - это использовать промежуточное программное обеспечение вместо конечной точки. В вашем config.ru
может быть что-то вроде этого:
use SimpleAdapter
run Rack::File
А ваш lib/simple_adapter.rb
может выглядеть примерно так:
class SimpleAdapter
SLASH_OR_INDEX = %r{/(?:index)?}
def initialize(app)
@app = app
end
def call(env)
request = Rack::Request.new(env)
if request.path =~ SLASH_OR_INDEX
# return some Rack response triple...
else
# pass the request on down the stack:
@app.call(env)
end
end
end