Robinho
Robinho

Reputation: 1030

What's means this '(?U)' on nginx regex

I was reading nginx's documentation, but a I don't what this '(?U)' are doing in this regex.

http://wiki.nginx.org/HttpFastcgiModule#fastcgi_split_path_info

Here's an example. The script show.php receives as argument the string article/0001. The following configuration will handle path splitting properly:

location ~ ^.+\.php {
  (...)
  fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_param PATH_INFO $fastcgi_path_info;
  fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
  (...)
}

Requesting /show.php/article/0001 sets SCRIPT_FILENAME to /path/to/php/show.php and PATH_INFO to /article/0001.

This regex is not enough?

fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;

Thanks

Upvotes: 3

Views: 2242

Answers (1)

Chuan Ma
Chuan Ma

Reputation: 9914

?U is ungreedy match in regex. By default regex uses 'greedy' mode.

In this case, it's needed. With greedy match, this following request

/show.php/article/0001/another.php/something

will have the script part set as

/show.php/article/0001/another.php

This could cause unexpected security issue.

[UPDATE]

nginx uses pcre regex: http://www.pcre.org/pcre.txt

    (?U)            default ungreedy (lazy)

Upvotes: 7

Related Questions