Назад | Перейти на главную страницу

правило 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/transactions-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/transactions-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%2FGcloud%2F150.203.213.249%2Flat%3D-35.271475%2Flong%3D149.121434%2F2019-02-26T07%253A14%253A19.932Z%2Faustralia-southeast1

В настоящее время я использую NE флаг, чтобы не убежать $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 / широта = -35,271475 / долгота = 149.121434 / 2019-02-26T07% 3A14% 3A19.932Z / австралия-юго-восток1

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

И для 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. - это намеренно?