我在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。
答案 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/
,我已从末尾删除了$
,因为它限制了与普通目录调用的匹配