.htaccess drupal 7 RedirectMatch 或 RewriteRule 没有接缝工作

.htaccess drupal 7 RedirectMatch or RewriteRule nothing seams to work

我在 .htaccess 和 drupal 7 中使用重定向时遇到了一些实际问题。

我有 link 个这样的:

example.com/vid/category/filter?subcat_filter_depth=125

我需要他们去:(在同一个域上)

example.com/vid/category/filter?type=All&subcat_filter_depth=125

= 之后,数字可能会有所不同,例如 67 或 32 等。这意味着可以是任何数字,并且原始 link 末尾的任何数字也需要在末尾新 link.

我认为 link 几乎是相同的路径只是不同的过滤器是导致问题的原因,因为即使是 Drupal 重定向 url 模块也不允许它尝试一次添加一个。

这是我尝试过的一切:

RedirectMatch 301 ^/vid/category/filter?subcat_filter_depth=(.*) /vid/category/filter?type=All&subcat_filter_depth=

RewriteRule ^(.*)/vid/category/filter?subcat_filter_depth=(.*) /vid/category/filter?type=All&subcat_filter_depth= [R=301]

RedirectMatch ^/vid/category/filter?subcat_filter_depth=(.*) ^/vid/category/filter?type=All&subcat_filter_depth=

RedirectMatch 301 ^(.*)/filter?subcat_filter_depth=(.*) ^/filter?type=All&subcat_filter_depth=

RedirectMatch ^/(.*)/filter?subcat_filter_depth=(.*) ^//filter?type=All&subcat_filter_depth=

RewriteRule "^/(.*)/filter?subcat_filter_depth=(.*)" "^//filter?type=All&subcat_filter_depth="

mod_rewrite 已打开,000-default.conf <VirtualHost> 中的 <Directory> 下有一个 AllowOverride pathed/to/the/.htaccess 文件 运行在 Debian Apache 上……几乎是最新版本。

我知道 mod_rewrite 正在工作,因为如果我添加了错误的规则或重写了语法错误,我会收到错误 500 响应页面。

我已经搜索并尝试了几乎所有我能想到的方法,但似乎没有任何效果。

如能帮助整理和运行,我们将不胜感激!

RedirectMatch (mod_alias) 和 RewriteRule (mod_rewrite) 指令仅匹配 URL-path,这明显排除了 查询字符串.

要匹配查询字符串,您需要使用 RewriteRule 和一个额外的 条件 RewriteCond 指令)来检查 QUERY_STRING 服务器变量。

此规则还需要靠近 .htaccess 文件的顶部,在任何现有重写之前。

例如:

RewriteCond %{QUERY_STRING} ^subcat_filter_depth=\d+$
RewriteRule ^vid/category/filter$ /[=10=]?type=All [QSA,R=302,L]

这会将 example.com/vid/category/filter?subcat_filter_depth=<number> 重定向到 example.com/vid/category/filter?type=All&subcat_filter_depth=<number>

.htaccess 中,与 RewriteRule 模式 匹配的 URL-path 上没有斜杠前缀。 IE。 ^vid/category(不是 ^/vid/category)。

[=23=] 是一个反向引用,包含 RewriteRule 模式 .

中匹配的 URL-path

QSA 导致原始查询字符串(例如 subcat_filter_depth=125)附加到 substitution 字符串中声明的查询字符串,即。 type=All 变为 type=All&subcat_filter_depth=125.

使用 302(临时)重定向进行测试以避免潜在的缓存问题。仅更改为 301(永久)重定向 - 如果这是意图 - 一旦您确认它按预期工作。

您可能需要在测试前清除浏览器缓存。

我能够想出一个在答案(上图)之前有效的解决方案,我标记为正确,因为我的解决方案不太优雅。

  • 经过更多的研究,我确实意识到我需要使用带有 %{QUERY_STRING} 的 RewriteCond 来实现我想要实现的目标。

  • 再次没有上面的答案那么优雅......但这是我的代码:

RewriteCond %{REQUEST_URI} ^/vid/category/filter [NC]
RewriteCond %{QUERY_STRING} ^(.*)=(.*)
RewriteRule (.*) /vid/category/filter?type=All&subcat_filter_depth=%2 [R=301,L]

这实际上在输入时将 url 保留在浏览器中 (/var/category/filter?subcat_filter_depth=),但显示的页面就像是使用正确的类型过滤器打开的一样=ALL 并且在浏览器和 Drupal dblog 中都没有产生错误。

上面的解决方案单独解释更有用,让我更好地理解了如何分解 URL 并将其与修改一起放回原处,尤其是在处理具有像 unique 一样变化的变量的字符串时身份证。