The path_rewriter plugin allows you to rewrite the remaining path or the path info for requests. This is useful if you want to transparently treat some paths the same as other paths.
By default, rewrite_path
will rewrite just the remaining path. So only routing in the current Roda
app will be affected. This is useful if you have other code in your app that uses PATH_INFO and needs to see the original PATH_INFO (for example, when using relative links).
rewrite_path '/a', '/b' # PATH_INFO '/a' => remaining_path '/b' # PATH_INFO '/a/c' => remaining_path '/b/c'
In some cases, you may want to override PATH_INFO for the rewritten paths, such as when you are passing the request to another Rack app. For those cases, you can use the path_info: true
option to rewrite_path
.
rewrite_path '/a', '/b', path_info: true # PATH_INFO '/a' => PATH_INFO '/b' # PATH_INFO '/a/c' => PATH_INFO '/b/c'
If you pass a string to rewrite_path
, it will rewrite all paths starting with that string. You can provide a regexp if you want more complete control, such as only matching exact paths.
rewrite_path /\A\/a\z/, '/b' # PATH_INFO '/a' => remaining_path '/b' # PATH_INFO '/a/c' => remaining_path '/a/c', no change
Patterns can be rewritten dynamically by providing a block accepting a MatchData object and evaluating to the replacement.
rewrite_path(/\A\/a\/(\w+)/){|match| "/a/#{match[1].capitalize}"} # PATH_INFO '/a/moo' => remaining_path '/a/Moo' rewrite_path(/\A\/a\/(\w+)/, path_info: true){|match| "/a/#{match[1].capitalize}"} # PATH_INFO '/a/moo' => PATH_INFO '/a/Moo'
All path rewrites are applied in order, so if a path is rewritten by one rewrite, it can be rewritten again by a later rewrite. Note that PATH_INFO rewrites are processed before remaining_path rewrites.
Classes and Modules
Public Class methods
# File lib/roda/plugins/path_rewriter.rb 48 def self.configure(app) 49 app.instance_exec do 50 app.opts[:remaining_path_rewrites] ||= [] 51 app.opts[:path_info_rewrites] ||= [] 52 end 53 end