目标-如果QS不符合某些条件,请删除查询字符串并重定向到父URL。因此,例如,此网址的QS错误:
exports.isPhoneAlreadyExists = (req, res) => {
var searchedPhone = req.params.phone;
var searchOnPhoneWithOr = [{ 'phone1': searchedPhone }, { 'phone2': searchedPhone }, { 'phone3': searchedPhone }, { 'phone4': searchedPhone }, { 'phone5': searchedPhone }];
contact.find({ $or: searchOnPhoneWithOr }, {}, function (err, resp) {
if (err) {
res.send(err);
}
res.json(resp);
});
};
应重定向到:
https://www.example.com/view.php?id=qqq
到目前为止,我有这个:
https://www.example.com/view.php
但是它不起作用,要么报告403错误,要么报告500内部服务器错误,或者重定向太多,或者在WAMP中检查它时都没有站点CSS加载等。
我也尝试过这个:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(?!(mk=[1-9][0-9]{0,1}|id=[1-9][0-9]{0,3})$).*$
RewriteRule ^view\.php$ view.php? [L,R]
它可以很好地重定向,但不会删除查询字符串。也尝试过QSD标志。
请帮助。
答案 0 :(得分:1)
尝试一下:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^.+$
RewriteCond %{QUERY_STRING} ((?:^|&)id=([^&]+)|(?:^|&)mk=([^&]+))
RewriteRule ^view\.php$ view.php? [L]
第一部分检查以确保存在查询字符串,以避免重定向循环。
第二部分检查查询字符串中是否存在id =或mk =参数。
然后,第三部分将view.php(带有或不带有querystring)重定向到同一文件,但修剪掉querystring。在这种情况下,这可能仍然会在URL中显示一个无用的问号,请参阅QSD
(查询字符串丢弃)是否更好。请注意,使用了最后一条规则的L
标志。这将防止对当前迭代进行任何进一步的重写。 Apache仍然需要再次从顶部开始扫描文件,以确保不需要进一步重写。
如果这将遇到您未向我们展示的其他重写规则的重定向循环,则可能需要利用.htaccess文件顶部的以下技巧:
RewriteEngine On
#Break infinite loops
RewriteCond %{ENV:REDIRECT_SKIP_ROOT_HTACCESS_FILE} =1
RewriteRule ^.*$ - [L]
# ...
# more logic can go here
# ...
# trim querystring from bad links
RewriteCond %{QUERY_STRING} ^.+$
RewriteCond %{QUERY_STRING} ((?:^|&)id=([^&]+)|(?:^|&)mk=([^&]+))
RewriteRule ^view\.php$ view.php? [L,ENV=SKIP_ROOT_HTACCESS_FILE=1]
如果您需要测试mk=[1-9][0-9]{0,1}
或id=[1-9][0-9]{0,3}
,则上面的内容应该很容易编辑。只需用数字逻辑替换([^&]+)
的实例即可。
答案 1 :(得分:1)
您的规则很好地代替了.*
,这意味着0 or more match
,这就是为什么在删除查询字符串时发生循环,因此不需要更多行的原因,您只能更改此部分.*
.+
的意思是1 or more match
:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(?!(mk=[1-9][0-9]{0,1}|id=[1-9][0-9]{0,3})$).+$
RewriteRule ^view\.php$ view.php? [L,R]