.htaccess:仅针对特定请求重定向子文件夹根,并保留参数

时间:2019-02-19 21:06:31

标签: regex apache .htaccess mod-rewrite

我正在努力实现条件重定向。 所有请求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:

2 个答案:

答案 0 :(得分:0)

The documentation告诉我们:

  

修改查询字符串

     

默认情况下,查询字符串不更改地传递

但是,您正在将其明确设置为空。

答案 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(永久)-仅在确认它可以正常工作后才能使用。

在测试之前,您需要清除浏览器缓存。