使用 .htaccess 重写查询字符串而不改变链接结构

问题描述

我想从 URL 中删除查询字符串并在没有查询字符串的情况下重写它,而不必重新编码链接结构。

添加了这个:

RewriteCond %{QUERY_STRING} .
RewriteRule ^$ /? [R,L]

到我现有的 .htaccss 代码的末尾(因此它是最后完成的事情,因为在此之前还有其他重写规则)但未删除查询字符串。我做错了什么?

这是我当前 .htaccess 文件内容

RewriteEngine On

RewriteRule ^userfiles/ - [L]
RewriteRule ^userdata/ - [L]

RewriteCond %{THE_REQUEST} /index\.PHP\?p=(?!admin)(?!superadmin)((?![^&]*?edit)[^\s&]+) [NC]
RewriteCond %{THE_REQUEST} /index\.PHP\?p=([^\s&]+) [NC]
RewriteRule ^ /%1? [R=301,L,QSA]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ index.PHP?p=$1 [L,QSA]

此外,我还有一个关于如何影响查询字符串作为变量的可用性的一般性问题……换句话说,如果我重新编写 URL 以不显示查询字符串,那么如果在 PHP 中,该查询字符串是否仍然可用?写 $_GET['q'] 还是不再设置? 谢谢

解决方法

对于您展示的样品,请您尝试以下一次。在测试您的 URL 之前,请确保清除浏览器缓存。在重定向删除查询字符串时,因为您的其他规则实际上并未重定向,如果这是您想要的,那么此更改可能会在此处为您提供帮助。

RewriteEngine On
RewriteRule ^userfiles/ - [L]

RewriteRule ^userdata/ - [L]

RewriteCond %{THE_REQUEST} /index\.php\?p=(?!admin)(?!superadmin)((?![^&]*?edit)[^\s&]+) [NC]
RewriteCond %{THE_REQUEST} /index\.php\?p=([^\s&]+) [NC]
RewriteRule ^ /%1? [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ index.php?p=$1 [L,QSA]