我花了2个小时在线尝试获取适用于此的htaccess,我想将所有example.com/?s=keyword/
重定向到example.com/?s=keyword
我想使用.htaccess从网址中删除/符号,请寻求帮助
答案 0 :(得分:1)
由于后缀斜杠出现在URL的查询字符串部分,因此您需要使用mod_rewrite并对照QUERY_STRING
服务器变量进行检查。 RewriteRule
(和Redirect
,RedirectMatch
)伪指令仅与URL路径匹配。
(链接的问题处理URL路径上的尾部斜杠,而不是查询字符串-这是一个不同的问题。)
在您的.htaccess
文件的最顶部,在任何现有的WordPress指令之前(即# BEGIN WordPress
之前,)尝试以下操作:
RewriteCond %{QUERY_STRING} ^s=(\w+)/$
RewriteRule ^$ /?s=%1 [R,L]
(\w+)
-匹配包含一个或多个“单词”字符(a-z
,A-Z
,0-9
,{{ 1}})。 替换字符串中的_
后向引用包含此关键字。
如果WordPress区块中已经存在%1
指令,则无需重复。
旁边:我确实想知道为什么为什么?由于这是RewriteEngine On
URL参数的一部分,因此PHP代码可以(并且应该)已经解决了这个问题?
UPDATE#1:
您的代码有效,但是如果网址上有空格或
s
或-
符号,它将不会重定向
空格可以在查询字符串中编码为+
或%20
。只要允许您简单地允许+
即可,而不是将其限制为特定的URL编码字符,则可以将指令修改为:
%
需要使用RewriteCond %{QUERY_STRING} ^s=([\w%+-]+)/$
RewriteRule ^$ /?s=%1 [NE,R,L]
指令上的NE
(noescape
)标志,以防止Apache将RewriteRule
(应在请求中出现)URL编码为{ {1}}(替代)。本质上是防止Apache对输出URL进行双重编码。我们假设,如果请求的URL上已经存在%
,则它已经是有效的URL编码序列的一部分,例如。 %25
(如果是空格)。
要允许任何内容,然后将%
指令更改为:
%20
请注意,这假定该URL上只有一个URL参数(如您的示例所示)。
还请注意,这些当前是302(临时)重定向。如果这应该是永久的,则将RewriteCond
更改为RewriteCond %{QUERY_STRING} ^s=(.+)/$
,但只有在确认它可以正常工作后才能将其更改(以避免缓存问题)。
UPDATE#2:
如果我要将文件夹
,该怎么办?R
重定向到R=301
如本例所示,要重定向特定的子目录(或路径段),然后将example.com/stack/?s=keyword/
伪指令修改为:
example.com/stack/?s=keyword
如果您需要匹配根目录或此子目录,请使用:
RewriteRule
要匹配 any 子目录或根目录,请使用以下内容:
RewriteRule ^stack/$ /$0?s=%1 [NE,R,L]
请注意,在此示例中,子目录仅限于“单词”字符加RewriteRule ^(stack/)?$ /$1?s=%1 [NE,R,L]
(连字符)。