服务器:Nginx
应用:PHP
有问题的网址是
/ p / all_articles / user / ABC
/ p / all_articles / user / ABC / page / 123
这是
/index.php?p=all_articles&user=ABC
/index.php?p=all_articles&user=ABC&page=123
ABC = this could be a-zA-Z0-9 as it's username
123 = this could be page numbers 0-9
尝试了许多组合和选项,以下内容使我更接近预期结果,但这并不完美。
location /p/all_articles {
rewrite ^/p/all_articles/user/(.*)?$ /index.php?p=all_articles&user=$1 last;
rewrite ^/p/all_articles/user/(.*)/page(?:/([0-9]+))?$ /index.php?p=all_articles&user=$1&page=$2 last;
try_files $uri $uri/ /index.php;
}
上面的重写位置块仅在其中一个被引用而另一个却不起作用时才产生。
相似地
/搜索/查询
/ search / QUERY / page / 123
这是
/index.php?search=QUERY
/index.php?search=QUERY&page=123
QUERY = anything a-zA-Z0-9 and space
123 = this could be page numbers 0-9
像all_articles一样,我能得到的最接近的是
location /search {
rewrite ^/search /index.php?search last;
rewrite ^/search/(.*)/page(?:/([0-9]+))?$ /index.php?search=$1&page=$2 last;
try_files $uri $uri/ /index.php;
}
但是,这样做可以在引用另一个重写时获得其中一个干净的URL,但不能在一起。
如果有人提供解决此问题的答案,我将不胜感激。
该rewrite
语句在顺序评估,以便更具体的正则表达式需要一个特定的更少正则表达式之前。
使用两个正则表达式:
^/search
^/search/(.*)/page(?:/([0-9]+))?$
第一个将匹配第二个正则表达式,因此第二个正则表达式将永远不会被求值。
一种简单的解决方案是颠倒rewrite
两个location
块中语句的顺序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句