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

rewrite query string with .htaccess without altering link structure

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

我添加了这个:

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= [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= [L,QSA]