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

5sxhfpxr  于 2023-02-24  发布在  其他
关注(0)|答案(3)|浏览(167)

目标-删除查询字符串并重定向到父URL,如果QS不符合某些条件。因此,作为一个例子,这个URL与错误的QS:

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标志了。
拜托,帮帮我。

4bbkushb

4bbkushb1#

试试这个:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^.+$
RewriteCond %{QUERY_STRING} ((?:^|&)id=([^&]+)|(?:^|&)mk=([^&]+))
RewriteRule ^view\.php$ view.php? [L]

第一部分检查以确保querystring存在以避免重定向循环。
第二部分检查查询字符串中是否存在id =或mk =参数。
然后第三部分重定向view.php(带或不带查询字符串)到同一个文件,但删除了查询字符串。这可能仍然会在URL中显示一个无用的问号,在这种情况下,看看QSD(querystring discard)更好。注意,使用了最后一个规则的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},上述代码应该很容易编辑,只需将([^&]+)的示例替换为数值逻辑即可。

nbnkbykc

nbnkbykc2#

您的规则是好的,除了这个.*,这意味着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]
drkbr07n

drkbr07n3#

仅在末尾添加?将删除查询字符串。

RewriteRule ^forum_diskuse/ poradna/1/? [R=301,L]

相关问题