htaccess 如何使用特殊字符重写规则?

htaccess 如何使用特殊字符重写规则?

我有一个网站,我想重定向以下请求:

www.example.com/wwv_flow.js_messages?p_app_id=103&p_lang=fr&p_version=19.1.0.00.15-51560988

到 :

www.example.com/apex/app/wwv_flow.js_messages?p_app_id=103&p_lang=fr&p_version=19.1.0.00.15-51560988

基本上,规则是,只要请求以威爾士, 然后加顶点/应用程序/就在之前,保持一切不变。

在我的.htaccess文件中我尝试过:

RewriteCond %{HOST_NAME} ^wwv([.]+)/?$
RewriteRule ^wwv([.]+)/?$ ./apex/app/$1 [L]

但它不起作用。首先,条件不起作用,其次,由于 URL 中的特殊字符,重定向失败:?、&、=

有人知道如何解决这个问题吗?

答案1

RewriteCond %{HOST_NAME} ^wwv([.]+)/?$
RewriteRule ^wwv([.]+)/?$ ./apex/app/$1 [L]

由于以下几个原因,此规则块永远不会匹配所述 URL:

  • 正则表达式[.](一个点里面字符类)匹配文字点,而不是“任意字符“。字符类否定了点的特殊含义。因此,[.]+匹配一个或多个点。您应该删除方括号,即。.+为了匹配一个或多个“任何字符”。尽管为了匹配任何只是“以wwv”开头的请求(如您的问题中所述),整个正则表达式可以简化为^wwv(.*)
  • RewriteCond指令中,你似乎试图匹配wwv部分与主机名. 在您的示例 URL 中wwv是 URL 路径的一部分,而不是主机名
  • 没有这样的变量HOST_NAME。也许你的意思是HTTP_HOST?但是,这仍然是不正确的(如上所述)。(你应该使用REQUEST_URI- 来匹配 URl 路径 - 但这样正则表达式仍然不正确。但是,这个条件无论如何都是多余的。)

RewriteCond这里不需要 (条件) 指令。(在指令中重复执行相同的比较是RewriteCond多余RewriteRule的,只会导致更多的“工作”。)

./上的前缀RewriteRule 代换此处不需要,应将其删除。

请注意RewriteRule 图案仅匹配 URL 路径。这特别排除了查询字符串。(如果您特别需要匹配查询字符串,那么您将需要一个与服务器变量RewriteCond匹配的指令QUERY_STRING。但这不是必需的。)

首先,条件不起作用;其次,由于 URL 中的特殊字符,重定向失败:?,,&=

这些并不是真正的“特殊字符”,它们不应该在这里造成问题。它失败是因为它根本就不做任何事情(如上所述)——它与请求的 URL 不匹配。

请求参数被传递到代换默认情况下,因此您不需要对“特殊字符”执行任何操作。

解决方案

每当请求以 开头时wwv,则apex/app/在前面添加并保持所有内容相同。

要执行必要的“重定向”,您将需要以下内容:

RewriteRule ^wwv(.*) /apex/app/$1 [R=302,L]

捕获(.*)子模式与 URL 路径的其余部分匹配,即。_flow.js_messages在您的示例中。然后在代换带有$1反向引用。

如上所述,查询字符串(即。p_app_id=103&p_lang=fr&p_version=19.1.0.00.15-51560988)被传递给代换默认情况下。这里您不需要执行任何额外操作。

请注意,这是一个 302(临时)重定向。

如果您需要内部重写(如代码片段所示)然后删除该R标志。并可选择删除RewriteRule 代换(但这取决于RewriteBase-的值(如果有的话)。

RewriteRule ^wwv(.*) apex/app/$1 [L]

请注意,这些指令的顺序.htaccess很重要。如果您有现有的 mod_rewrite 指令,那么这些指令可能需要放在顶部附近。

如果这是您要执行的唯一操作,那么您实际上并不需要 mod_rewrite。mod_aliasRedirectMatch就足够了。但是,如果您有现有的 mod_rewrite 指令,mod_rewrite 可能是必要的。

相关内容