Мое текущее правило
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
Это не распознается моим сервером связанных фрагментов данных. В /
не кодируется. я думаю 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.
- это намеренно?