重写空查询字符串

Posted

技术标签:

【中文标题】重写空查询字符串【英文标题】:Rewrite for an empty query string 【发布时间】:2011-04-07 13:09:18 【问题描述】:

我正在为我的一个站点构建一些缓存,但我似乎无法找到是否可以使用 mod_rewrite 添加条件以仅在请求上的查询字符串为空时应用。

例如,我很想知道我是否可以有一个没有像

这样的查询字符串的请求
http://www.example.com/

加载页面

http://www.example.com/index.home.html

但是任何带有查询字符串的请求,比如

http://www.example.com/?id=32

正常加载,不受重写影响。

我错过了什么?

【问题讨论】:

【参考方案1】:

为了匹配空 QueryString ,我们在条件模式中使用 ^$。以下规则将 /file.html 重定向到 /file2.html 但由于该条件而无法重定向 /file.html?querystring

RewriteEngine on

RewriteCond %QUERY_STRING ^$
RewriteRule ^/?file.html$ /file2.html? [L,R]

规则末尾的空问号很重要,因为它会丢弃旧的查询字符串,否则重定向的 url 将类似于 /file2.html?querystring

或者: 重写引擎开启

RewriteCond %QUERY_STRING ^$
RewriteRule ^/?file.html$ /file2.html [L,R,QSD]

如果有查询字符串,则 QSD 标志不保留。

【讨论】:

如果 RewriteCond 过滤掉带有查询字符串的任何内容,那么如何包含问号“重要”?没有被重写的 URL 将保留查询字符串。还是我误会了?【参考方案2】:

我知道这个很老了,但更好的选择是:

RewriteCond %QUERY_STRING -n
RewriteRule ^/$ /index.home.html

【讨论】:

为什么更好?【参考方案3】:

我想通了。这似乎很好地解决了这个问题:

RewriteCond %QUERY_STRING ^$
RewriteRule ^/$ /index.home.html

当然,如果有更好的方法,我很乐意听到。

【讨论】:

非常感谢!确实帮助我解决了生产问题。

以上是关于重写空查询字符串的主要内容,如果未能解决你的问题,请参考以下文章

将查询字符串重写为另一个查询字符串

重写查询字符串

Mod Rewrite + QSA:重写目标和查询字符串中的相同查询字符串参数 - 可以强制使用目标吗?

PHP中查询字符串的HTACCESS重写规则

Apache2重写查询字符串转义两次

301 Htaccess 重写规则查询字符串