目标-删除查询字符串,如果QS不满足某些条件,则重定向到父url。因此,作为一个例子,这个带有错误QS的url:
https://www.example.com/view.php?id=qqq应重定向到:
https://www.example.com/view.php到目前为止我有这样的想法:
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]但它不能工作,要么报告403错误,或500内部服务器错误,或太多的重定向,或没有网站CSS加载等,而检查它在WAMP。
我也试过这个:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(?!(mk=[1-9][0-9]{0,1}|id=[1-9][0-9]{0,3})$).*$
RewriteRule ^view\.php$ - [L]它可以很好地重定向,但不删除查询字符串。也尝试用QSD标志。
拜托救救我。
发布于 2019-03-19 09:16:06
试试这个:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^.+$
RewriteCond %{QUERY_STRING} ((?:^|&)id=([^&]+)|(?:^|&)mk=([^&]+))
RewriteRule ^view\.php$ view.php? [L]第一部分检查以确保存在查询字符串以避免重定向循环。
第二部分检查查询字符串中是否存在id=或mk=参数。
然后,第三部分将view.php重定向到同一个文件(有或没有查询字符串),但是去掉了查询字符串。这可能仍然会在URL中显示一个无用的问号,在这种情况下,看看QSD (querystring )是否更好。注意,最后一条规则使用了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},那么上面的内容应该很容易编辑。只需用数字逻辑替换([^&]+)的实例即可。
发布于 2019-03-19 18:51:23
您的规则很好,超出了这个.* (意为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]https://stackoverflow.com/questions/55235469
复制相似问题