Правило htaccess для кодирования только некоторой захваченной группы

Мое текущее правило -

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

Он перенаправляет на http://35.231.131.100:5000/cocoon_v1.0.1?subject=https%3A%2F%2Fw3id.org%2Fcocoon%2Fdata/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

Это не может быть распознано моим сервером связанных фрагментов данных. / не кодируется. Я думаю, что объект не принимает частично закодированную строку. С помощью : он должен быть закодирован, поэтому вся строка темы должна идти с опцией кодирования.

А для флага 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 .

1
задан 27 May 2019 в 13:22
1 ответ

Вы можаце выкарыстоўваць 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. - гэта наўмысна?

1
ответ дан 3 December 2019 в 23:05

Теги

Похожие вопросы