Мое текущее правило -
RewriteRule ^data/(v[0-9]\.[0-9]\.?[0-9]?)/.*$ http://35.231.131.100:5000/cocoon_$1?subject=https://w3id.org/cocoon/$0 [L,NE,QSA,R=308]
Он преобразует
https://w3id.org/cocoon/data/v1.0.1/2019-03-07/CloudStorageTransactionsPriceSpecification/ Azure / managed_disk / transaction-ssd
-
http://35.231.131.100:5000/cocoon_v1.0.1?subject=https://w3id.org/cocoon/data/v1.0.1/2019-03- 07 / CloudStorageTransactionsPriceSpecification / Azure / managed_disk / transaction-ssd
Но для другого примера исходный URL
https://w3id.org/cocoon/data/v1.0.1/Measurement/DownlinkSpeed-1-128-KB/StorageService /Gcloud/150.203.213.249/lat=-35.271475/long=149.121434/2019-02-26T07%3A14%3A19.932Z/australia-southeast1
Мне нужно закодировать строку запроса для subject =
, т.е.
http://35.231.131.100:5000/cocoon_v1.0.1?subject=https%3A%2F%2Fw3id.org%2Fcocoon%2Fdata%2Fv1.0.1%2FMeasurement%2FDownlinkSpeed-1-128-KB%2FStorageService%2F % 2F150.203.213.249% 2Flat% 3D-35.271475% 2Flong% 3D149.121434% 2F2019-02-26T07% 253A14% 253A19.932Z% 2Faustralia-southeast1
В настоящее время я использую NE
flag, чтобы не экранировать $ 1
, то есть v1.0.1
.
Как мне закодировать часть https://w3id.org/cocoon/$0
?
Некоторые причины всего этого: Это :
в дате и времени часть URL-адреса остановила работу страницы, ее индивидуальное кодирование в % 3A
не работает, поэтому я кодирую всю часть subject =
.
Править
Правила, предложенные MrWhite , не совсем работают.
RewriteCond %{THE_REQUEST} [a-z]{3,5}\s.*?/(data/(v[0-9]\.[0-9]\.?[0-9]?)/.*)\s [NC]
RewriteRule ^data/(v[0-9]\.[0-9]\.?[0-9]?)/.* http://35.231.131.100:5000/cocoon_$1?subject=https\%3A\%2F\%2Fw3id.org\%2Fcocoon\%2F%1 [L,NE,QSA,R=308]
Я тестировал
curl http://localhost/cocoon/data/v1.0.1/Measurement/DownlinkSpeed-1-128Gcloud/150.203.213.249/lat=-35.271475/long=149.121434/2019-02-26T07%3A14%3A19.932Z/australia-southeast1
Это не может быть распознано моим сервером связанных фрагментов данных. /
не кодируется. Я думаю, что объект
не принимает частично закодированную строку. С помощью :
он должен быть закодирован, поэтому вся строка темы должна идти с опцией кодирования.
А для флага B
, который я тестировал с B = /
, кажется, что-нибудь кодируется дважды? то есть .С
на % 252e
и с /
на % 252f
?
И спасибо за непреднамеренное указание на конечную точку, мне действительно нужна v [0-9] \. [0-9] (?: \. [0-9])?
Я также пробовал использовать флаг N
, но не понял. Это превратилось в бесконечный цикл.
RewriteRule ^data/(v[0-9]\.[0-9]\.?[0-9]?)/([^/]+)/(.*) data/$1/$2\%2F$3 [N=20]
RewriteRule ^data/(v[0-9]\.[0-9]\.?[0-9]?)/.* http://35.231.131.100:5000/cocoon_$1?subject=https\%3A\%2F\%2Fw3id.org\%2Fcocoon\%2Fdata\%2F$1\%2F$3[L,NE,QSA,R=308]
Я хотел, чтобы [^ /] +
соответствовали чему-либо, кроме /, поэтому я могу заменить всю косую черту после номера версии на закодированное значение, добавив \
, чтобы избежать ]% 2F
.
Вы можаце выкарыстоўваць B
сцяг, каб пазбегнуць зваротных спасылак. Тым не менш, па змаўчанні гэта таксама пазбягае кропак у v1.0.1
у зваротнай спасылцы $ 1
, калі вы яўна не ўказваеце сімвалы, якія трэба экранаваць у B
сам сцяг, напр. B =:
(патрабуецца Apache 2.4.26 +).
Акрамя таго, калі фактычнай праблемай з'яўляецца ":
у частцы даты і часу URL", і гэта ўжо правільна закадзіраваны ў запытаным URL (як падаецца ў вашым прыкладзе), тады вы можаце атрымаць ужо кадаваную частку URL з зменнай сервера THE_REQUEST
замест URL-шляху ў адпаведнасці з RewriteRule
узор . "Праблема" атрымання частак URL з выкарыстаннем шаблона RewriteRule
заключаецца ў тым, што гэта ўжо расшыфравана URL (адсюль і прычына выкарыстання сцяга B
, як было згадана вышэй).
Вы можаце уручную кадаваць першую (пастаянную) частку радка запыту (г. зн. https://w3id.org/cocoon/
як https% 3A% 2F% 2Fw3id.org% 2Fcocoon% 2F
), калі вы хочаце, каб гэта было закадзіравана.
Паспрабуйце наступнае:
RewriteCond %{THE_REQUEST} [a-z]{3,5}\s.*?/(data/(v[0-9]\.[0-9]\.?[0-9]?)/.*)\s [NC]
RewriteRule ^data/(v[0-9]\.[0-9]\.?[0-9]?)/.* http://35.231.131.100:5000/cocoon_$1?subject=https\%3A\%2F\%2Fw3id.org\%2Fcocoon\%2F%1 [L,NE,QSA,R=308]
Дадатковыя заўвагі:
Літаральны %
для% -закадзіраваныя сімвалы ў радку падстаноўкі пазбягаюць зваротнай рыскі, каб не разглядацца як (несапраўдныя) зваротныя спасылкі на папярэдні CondPattern (інакш яны будуць разглядацца як зваротныя спасылкі на ).
Перад тэставаннем пераканайцеся, што вы ачысцілі кэш браўзэра, і правядзіце тэставанне з дапамогай часовага (302 ці 307) перанакіравання, перш чым змяніць яго на пастаяннае.
У баку: Ваш рэгулярны выраз, які захоплівае нумар версіі дазваляе ставіць кропку пасля другога ("мінорнага") нумара, напрыклад. v1.0.
- гэта наўмысна?