如果只有一个参数可以有斜线,那么通过指定正则表达式可以解决您的问题,其中只有一个捕获组被允许斜线。例如:
^datavore/(?P<configuration>[\w\d\.\-_]+)/(?P<dataset>.*)/(?P<varname>[\w\d\.\-_]+)/(?P<region>[a-z-A-Z\_]+)/(?P<date_range>[\w\d\.\-_]+)/filelist/$
datavore/some-config/dataset/subdataset/varname/region/date-range/filelist/
将导致下一个值匹配的组:
datavore/some-config/dataset/subdataset/varname/region/date-range/filelist/
144 steps to match
configuration [9-20] `some-config`
dataset [21-39] `dataset/subdataset`
varname [40-47] `varname`
region [48-54] `region`
date_range [55-65] `date-range`
如果几组能对他们有斜杠则没有准确的方法来正确地匹配他们使用额外的文本withou路径。有额外的文本示例解决路径:
^datavore/__conf__/(?P<configuration>.*)/__dataset__/(?P<dataset>.*)/__varname__/(?P<varname>.*)/__region__/(?P<region>[a-z-A-Z\_]+)/__date_range__/(?P<date_range>.*)/filelist/$
670 steps to match
datavore/__conf__/conf/subconf/__dataset__/dataset/subdataset/__varname__/varname/subvarname/__region__/region/__date_range__/date-range/filelist/
configuration [18-30] `conf/subconf`
dataset [43-61] `dataset/subdataset`
varname [74-92] `varname/subvarname`
region [104-110] `region`
date_range [126-136] `date-range`
注意/__dataset__/
是使用的,而不是简单的dataset
您可能需要用户具有价值的数据集至极开始与dataset
本身。这将导致问题:
^datavore/conf/(?P<configuration>.*)/dataset/(?P<dataset>.*)/varname/(?P<varname>.*)/region/(?P<region>[a-z-A-Z\_]+)/date_range/(?P<date_range>.*)/filelist/$
datavore/conf/conf-val/dataset/dataset/dataset-val/varname/varname-val/subvarname-val/region/region-val/date_range/date-range-val/filelist/
654 steps to match
configuration [14-30] `conf-val/dataset` // THIS SEEMS TO BE WRONG. We wanted this to be `conf-val`
dataset [39-50] `dataset-val` // THIS SEEMS TO BE WRONG. We wanted this to be `dataset/dataset-val`
varname [59-85] `varname-val/subvarname-val`
region [93-103] `region-val`
date_range [115-129] `date-range-val`
实际的解决方案高度依赖于可能的值的捕获组
如果您正在使用此路径作为API端点那么我建议你只是转储这种做法,使用GET参数代替
在调用端用其编码值('%2F')代替斜线可能会起作用,但我不确定URL匹配是在解码URL之前还是之后完成的。最好的答案可能是避免使用可能包含文字斜杠的URL参数。您也可以将其从GET更改为POST。 –
我测试了%2F,但它不工作,我不能真正改变/因为这是它的索引,我想也许我应该在客户端以base64格式编码参数 – azelix