今天同事发给我2个url地址,说url地址被百度收录了,由于用的是tp5.1的框架发现框架与原生会当get参数解析。
截止20230628之前的tp\5.1.42,6.1.3
是都有这个问题的
整体来说是一个不那么正规的带get参数的请求,框架给解析了
这样有个麻烦就造成了:人能看懂是个带有get参数的url路径,但是搜索引擎认为这个一个url是一个资源。
解决办法:改成以&符号为开头的uri不解析
if (!-e $request_filename) rewrite ^/(?!&)(.*)$ /index.php?s=$1 last;
在原来的 rewrite ^/(.*)$ /index.php?s=$1 last;
的技术上添加了(?!&)
在正则表达式中,负向零宽断言(negative lookahead assertion)是一种特殊的语法结构,用于在匹配过程中排除某些模式。它用于查找不满足某种条件的位置,而不进行实际的匹配。
负向零宽断言使用 (?!pattern) 的语法形式,其中 pattern 是一个正则表达式模式。它表示在当前位置后面不应该存在与 pattern 匹配的内容。如果断言成功,则继续匹配;如果断言失败,则继续尝试下一个位置。
在上述场景中,以 "&" 符号开头的请求路径。因此,可以使用负向零宽断言来实现,即 (?!&)。这样,正则表达式引擎会检查请求路径后面的字符,确保它不以 "&" 符号开头,然后才进行重写操作。
如果是不以&和/号开头可以这么写
(?!&|\/)
/需转义