Переписать URL, чтобы указать части запроса Nginx - PullRequest
1 голос
/ 12 апреля 2020

У меня возникла ситуация, когда я хочу переписать следующие URL-адреса и отправить свой первый параметр URL-адреса как параметр data, а остаток - как query параметр

www.example.com/anything.jpg      //Skip - Do Nothing because its a file from root
www.example.com/anything          //anything == ?data=$1
www.example.com/something/b       //something == ?data=$1    b == &query=$2
www.example.com/certainly/b/c     //certainly == ?data=$1    b/c == &query=$2
www.example.com/anything/b/c.jpg  //anything ==  ?data=$1    b/c.jpg == &query=$2
www.example.com/but/b/c/d         //but ==       ?data=$1    b/c/d == &query=$2

, поэтому мой первый параметр URL-адреса всегда будет будь data и отдыхай как query независимо от того, что у него есть. Я нашел этот вопрос здесь Перенаправление htaccess, только если оно имеет значение после пересылки sla sh и получило его в некоторой степени, например

rewrite ^/(.*)/(.+)$ /handle.php?data=$1&query=$2 last;

У него есть некоторые проблемы, так как это переписывает в следующие

www.example.com/anything.jpg      //Results in 404 Not Found
www.example.com/anything          //Results in 404 Not Found
www.example.com/something/b       //Working good
www.example.com/certainly/b/c     //data=certainly/b    query=c
www.example.com/anything/b/c.jpg  //data=certainly/b    query=c.jpg
www.example.com/but/b/c/d         //data=but/b/c        query=d

Я пытался поиграть с разными вариациями rewrite ^/(.*)/(.+)$ /handle.php?data=$1&query=$2 last;, но ничего не получалось

1 Ответ

1 голос
/ 25 апреля 2020

Чтобы я мог доказать результаты сопоставления с регулярным выражением, я продемонстрирую с помощью preg_replace(), но шаблон должен легко преобразоваться в ваш сценарий.

Код: ( Demo )

$urls = [
    'www.example.com/anything.jpg',      //Skip - Do Nothing because its a file from root
    'www.example.com/anything',          //anything == ?data=$1
    'www.example.com/something/b',       //something == ?data=$1    b == &query=$2
    'www.example.com/certainly/b/c',     //certainly == ?data=$1    b/c == &query=$2
    'www.example.com/anything/b/c.jpg',  //anything ==  ?data=$1    b/c.jpg == &query=$2
    'www.example.com/but/b/c/d',         //but ==       ?data=$1    b/c/d == &query=$2
];

var_export(
    preg_replace('~www\.example\.com/(?![^/]+\.jpg)([^/]+)(?:/(.+))?~', 'www.example.com?data=$1&query=$2', $urls)
);

Вывод:

array (
  0 => 'www.example.com/anything.jpg',
  1 => 'www.example.com?data=anything&query=',  // note the empty query value
  2 => 'www.example.com?data=something&query=b',
  3 => 'www.example.com?data=certainly&query=b/c',
  4 => 'www.example.com?data=anything&query=b/c.jpg',
  5 => 'www.example.com?data=but&query=b/c/d',
)

Использование класса отрицательных символов, содержащего sla sh для первой группы захвата, позволит жадное (быстрое) сопоставление без слишком большого совпадения.

Отрицательный взгляд предотвращает сопоставление файла jpg.

Вторая группа захвата является необязательной, поэтому, если вы не хотите написать отдельный шаблон для сопоставления только с URL-адресами data, вам придется допустить пустое назначение.

Для ваших целей мое непроверенное предложение:

Одно объявление:

rewrite ^/(?![^/]+\.jpg)([^/]+)(?:/(.+))?$ /handle.php?data=$1&query=$2 last;

Или как два объявления:

rewrite ^/(?![^/]+\.jpg)([^/]+)$ /handle.php?data=$1 last;
rewrite ^/(?![^/]+\.jpg)([^/]+)/(.+)$ /handle.php?data=$1&query=$2 last;
...