在Apache中需要静默重写URL

时间:2012-05-10 06:56:19

标签: apache mod-rewrite url-rewriting friendly-url

我在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时,但在浏览器网址栏中,网址已更改为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。

2 个答案:

答案 0 :(得分:1)

如果您想要静音重写(地址栏中的URL未更改),则需要使用[P] flag,而不是[R = 301,L]。

基本上,请求被传递给代理服务器,因此客户端永远不会看到任何更改。

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

[P]标志包含隐含的[L] flag(最后一个命令),所以你要确保它们在任何之后发生:

  • 直接重写,例如删除www。,作为永久重定向,使用[R = 301]标记,但没有[L]。

  • 禁止[F] flag重写,如图像流失保护,在此之前完成,因为它还包含隐含的[L]。

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

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

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

答案 1 :(得分:0)

删除R=301,因为它将浏览器移动到新地址

你可以简化:

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

右侧没有/,htaccess流不会重启

assets部分仅适用于/APPLICATION/assets/,而不仅仅是/assets/,我已从末尾删除了$,因为它限制了与普通目录调用的匹配