Apache在https上操作查询字符串

时间:2017-09-04 16:12:11

标签: apache mod-rewrite

以下规则适用于http但不适用于https。

RewriteCond %{QUERY_STRING}    "page=" [NC]
RewriteRule (.*)  /$1? [L]
RewriteRule ^/path/file.html$ https://www.domain.tld/path/file/ [R=301,L]

为什么query_string部分在https中不起作用?

3 个答案:

答案 0 :(得分:0)

根据您的问题的评论,您似乎只想在有页面参数的情况下删除查询字符串。除非存在重定向,否则此类重写规则不会剥离或更改URL。因此,如果您不在重写规则中添加R=301R,则不会删除查询字符串。以下所有工作都在我的服务器上删除查询字符串,我的服务器是100%HTTPS:

RewriteCond %{QUERY_STRING} "page=" [NC]
RewriteRule (.*) /$1? [R=301,L]

或者您可以使用QSD标志而不是问号:

RewriteCond %{QUERY_STRING} "page=" [NC]
RewriteRule (.*) /$1 [R=301,L,QSD]

或者你可以使用这样的东西:

RewriteCond %{QUERY_STRING} "page=" [NC]
RewriteRule .* /? [R=301,L]

或者只是R(对于302)而不是R = 301:

RewriteCond %{QUERY_STRING} "page=" [NC]
RewriteRule (.*) /$1? [R,L]

但除非我使用重定向,否则不会删除查询字符串。

答案 1 :(得分:0)

您真正需要的只是 QSD http://httpd.apache.org/docs/current/rewrite/flags.htm

RewriteCond %{QUERY_STRING} "page=" [NC]
RewriteRule (.*)  /$1 [L,QSD]

我不确定为什么它会在http而不是https上工作,除非你为http和https使用单独的vhosts并且settigns略有不同

请记住,除非使用R标志,否则重写规则是内部的。当您使用R标志时,它告诉浏览器转到另一个页面,导致完整的服务器/客户端往返。否则,它只是更改请求并正常进行。

答案 2 :(得分:0)

我对.htaccess文件并不是很强大,而且无法解释幕后发生的事情,但是从我看来你的.htaccess文件应该是这样的:

RewriteCond %{QUERY_STRING} page= [NC]
RewriteRule (.*)  /$1? [L]
RewriteRule ^path/file.html$ https://www.domain.tld/path/file/ [R=301,L]

它非常适合

http://example.com?page=1
https://example.com/?page=1
http://example.com/path/file.html
https://example.com/path/file.html

经过测试(有爱)here