.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 一样变化的变量的字符串时身份证。
我在 .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
模式 .
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 一样变化的变量的字符串时身份证。