2013-12-23 5 views
3

У меня возникли проблемы с правилом mod_rewrite, не соответствующим, когда я думаю, что это нужно.mod_rewrite правило регулярных выражений с закодированными новыми строками (% 0A)

правило заключается в следующем:

RewriteRule ^api/(.*)\.(json|xml|csv|txt|printr|basictxt)$ api/endpoint.php?api_request=$1&api_response_type=$2 [QSA] 

И пример Ссылка:

http://ourdomain.tld/api/aaaaa/bbbb/cccc%0Adddd.json 

Это правило работает хорошо до тех пор, пока вы не $0A в URL (насколько Я могу сказать).

Я понимаю, что . означает что-либо, кроме новой строки, и пробовал правила, подобные следующим, чтобы обойти либо новые строки, либо процентные символы, поскольку я не совсем уверен, как он отформатирован в то время, когда mod_rewrite видит его, но никто не работал:

RewriteRule ^api/([.\s]*)\.(json|xml|csv|txt|printr|basictxt)$ api/endpoint.php?api_request=$1&api_response_type=$2 [QSA] 


RewriteRule ^api/([.\%]*)\.(json|xml|csv|txt|printr|basictxt)$ api/endpoint.php?api_request=$1&api_response_type=$2 [QSA] 


RewriteRule ^api/([.%]*)\.(json|xml|csv|txt|printr|basictxt)$ api/endpoint.php?api_request=$1&api_response_type=$2 [QSA] 

Как ни странно, даже в следующем не будет работать на всех URLs, даже те, без % символов:

RewriteRule ^api/([.]*)\.(json|xml|csv|txt|printr|basictxt)$ api/endpoint.php?api_request=$1&api_response_type=$2 [QSA] 

Я был бы очень признателен, если кто-то может пролить некоторый свет на это для меня как я могу на самом деле не изменяйте, как работает API (IE я не могу кодировать base64 и т. д.), и вам нужно получить значение с новой строкой в ​​нем.

Я тестировал его на http://htaccess.madewithlove.be/, и их инструмент считает, что он должен работать!

EDIT:

У нас было решение для URL выше, но он не работает с примером, как:

/api/something/sent+40.06K+bytes++received+7.83M+bytes++542.70K+bytes%2Fsec%0Atotal+size+is+19.83G++speedup+is+2520.16+%28Completed+in+14+seconds%29.json 

Спасибо.

+1

mod_rewrite является сомнительным с символами новой строкой (и другими закодированными специальными символами, такими как косые черты). Способом их сопоставления будет использование escape-последовательности '\ x':' \ x0A' является шестнадцатеричным представлением новой строки. Обычно видная конструкция - '[\ x00- \ xff]', буквально «любой байт», вы можете попробовать работать с ней, например, «RewriteRule api/([\ x00- \ xff]) *? \. (Json | xml | csv | txt | printr | basictxt) $ 'Обратите внимание на ленивую звезду. Я не могу проверить это сейчас, но, возможно, стоит попробовать. –

+0

@ SáT, спасибо. Я пробовал это, но больше не повезло! Должен быть способ заставить это работать. –

ответ

2

.... и нужно, чтобы получить значение для него с новой строки в нем.

Вы упускаете каретку ^ считается оператором отрицания внутри вашего класса персонажа [^.]

RewriteRule ^api/([^.]*)\.(json|xml|csv|txt|printr|basictxt)$ api/endpoint.php?api_request=$1&api_response_type=$2 [QSA] 

regex101 Смотреть демо

+0

Спасибо за ответ. Кажется, это работает, но я немного смущен. Разве карет не означает какого-либо персонажа, кроме символов в группе. То есть '[A-Z]' будет соответствовать любой прописной букве и '[^ A-Z]' ничего, кроме буквы верхнего регистра? Так что, конечно, '[^.]' Означает только соответствие новым строкам (или другим вещам, которые не соответствуют только «.» Самостоятельно?) В любом случае, ваш ответ, похоже, сделал трюк, поэтому спасибо. –

+0

На самом деле здесь говорится, что все подбирается до точки '.'затем сопоставить точку' \. 'Это отрицание для' 'ничего, кроме точки" '. – hwnd

+0

Спасибо, я только что попробовал еще несколько подлинных значений, которые будут отправлены в API, а некоторые из них содержат точки (так неудачно), а затем я увидел ваше редактирование с помощью '[\ S \ s]', который я пробовал следующая строка, но она не работает. regex101 думает, что, должно быть, http://regex101.com/r/uO0kA6 Можете ли вы помочь? –

Смежные вопросы