Чтобы я мог доказать результаты сопоставления с регулярным выражением, я продемонстрирую с помощью 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;