我有一个网站,我想重定向以下请求:
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 可能是必要的。