htaccess删除重定向URL上的查询字符串

时间:2019-03-19 07:18:03

标签: .htaccess

目标-如果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标志。

请帮助。

2 个答案:

答案 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]