0

我在apache后面运行tomcat。现在我需要通过从 URL 中删除参数名称来应用友好的 url。我想要

http://<domainname>/<APPLICATION>/QWERTY

这些内部应该作为

http://<domainname>/<APPLICATION>/vid=QWERTY

所以在tomcat中我可以得到vid的值并相应地处理请求

为此我尝试过,

<IfModule rewrite_module>
 RewriteEngine On    
   RewriteCond %{QUERY_STRING} !vid=(.*)$ [NC] 
   RewriteCond %{REQUEST_URI} !/assets/$ [NC]   
   RewriteRule ^/APPLICATION/(.*)$ /APPLICATION/?vid=$1 [R=301,L]    
</IfModule>

通过应用此应用程序,当我给出http://<domainname>/<APPLICATION>/QWERTY但在浏览器 URL 栏中,URL 更改为http://<domainname>/<APPLICATION>/vid=QWERTY

我也需要http://<domainname>/<APPLICATION>/QWERTY在浏览器地址中。

更新: 通过“Jacek_FH”的回答,我已经更新了我的规则 [已删除R=301]

   RewriteCond %{QUERY_STRING} !vid= [NC] 
   RewriteCond %{REQUEST_URI} !/assets/ [NC]   
   RewriteRule ^/APPLICATION/(.*)$ /APPLICATION/?vid=$1 [L] 

未找到其提供的资源异常(404)

所以为了测试我已经将我的友好网址更改为http://<domainname>/<APPLICATION>/u=QWERTY并尝试 了

    RewriteRule ^/APPLICATION/u=(.*)$ /APPLICATION/?vid=$1 [L] 

但这也会导致tomcat中的404。

4

2 回答 2

1

如果您想要静默重写(地址栏中的 URL 不变),您需要使用[P] 标志,而不是 [R=301,L]。

基本上,请求被交给代理服务器,所以客户端永远不会看到任何变化。

您不希望客户端,尤其是搜索引擎机器人进行永久重定向,因此您不希望 [R=301]。

[P] 标志包含一个隐含的[L] 标志(最后一个命令),因此您要确保它们出现在任何以下:

  • 失败的重写,比如删除 www.,是作为永久重定向完成的,带有 [R=301] 标志,但没有 [L]。

  • 禁止的[F] 标志重写,如图像出血保护,在这些之前完成,因为它还包含一个隐含的 [L]。

如apache文档中的 [P] 标志描述中所述,使您的RewriteCond语句的正则表达式具体说明处理的输入,并明确指定目标 URL,以便恶意或错误的用户输入不会创建不正确的 url。

请注意,[P] 标志防止连接池(使用默认工作线程),因此没有持久连接,可能会降低性能。

请注意,这似乎不适用于 https 站点,因此必须使用 [L] 标志而不是 [P] 标志,并且没有静默重定向。无赖!

于 2016-11-16T01:25:12.320 回答
0

R=301在将浏览器移动到新地址时删除

你可以简化:

RewriteEngine On
RewriteCond %{QUERY_STRING} !vid=
RewriteCond %{REQUEST_URI} !/assets/
RewriteRule ^/APPLICATION/(.*)$ APPLICATION/?vid=$1 [L]

如果没有/正确的部分,htaccess 流将不会重新启动

assets部分只需要/APPLICATION/assets/,而不仅仅是/assets/,我已经$从最后删除了,因为它限制了对普通目录调用的匹配

于 2012-05-10T07:21:14.100 回答