我正在努力实现条件重定向。
所有请求example.com/app/?s={some string}
(以及其他所有请求)都应重定向到example.com/?s={some string}
。
我尝试了很多事情,并查找了StackOverflow。我的最终草案是这样:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^\/app\/\?s=
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /? [R=301]
但是它没有用:-/有什么想法吗?
更新:
我现在的方法是
RewriteCond %{REQUEST_URI} ^\/app\/
RewriteCond %{QUERY_STRING} ^s=(.*)
RewriteRule (.*) / [R=301,L]
仍然不起作用:D
更新2:
答案 0 :(得分:0)
答案 1 :(得分:0)
所有请求
example.com/app/s={some string}
应该重定向到example.com/s={some string}
示例URL中没有?
,因此没有查询字符串。 s=
只是URL路径的一部分(严格来说,它不是URL参数)。 (但是,这确实与您试图匹配?
和查询字符串的代码示例相矛盾?正是我试图在注释中进行澄清。)
如果s={some string}
确实是URL路径的一部分,请尝试以下操作:
RewriteEngine On
RewriteRule ^app/(s=.*) /$1 [R=302,L]
更新:我忘记了上面的示例中的
?
在这种情况下,您的第一个“更新”应该已经生效(取决于放置指令的位置)。但是,最好这样写:
RewriteCond %{QUERY_STRING} ^s=
RewriteRule ^app/$ / [R=302,L]
在RewriteRule
模式中检查URL路径更为有效,因为这是首先处理的。默认情况下,查询字符串是通过查询字符串传递的(不需要 capture {some string}
)。
使用302(临时)重定向进行测试,以避免出现缓存问题。如果您打算这样做,请更改为301(永久)-仅在确认它可以正常工作后才能使用。
在测试之前,您需要清除浏览器缓存。