为什么 Apache 忽略我的重写规则?

为什么 Apache 忽略我的重写规则?

我有一个旧的应用程序,其 URL 形式如下...

http://apps.myserver.com/appname/viewItem.akt?p=123

我正在用具有类似 URL 的应用程序替换这个旧应用程序......

http://appname.myserver.com/item/123

我尝试添加几种不同的重写规则httpd/httpd.conf并重新启动服务器,但仍然出现 404 错误。

我尝试过几件事……

RewriteEngine on

RewriteRule ^.*viewItem.akt\?p=([0-9]*)$ http://appname.myserver.com/item/$1 [R]

或者...

RewriteRule ^/appname/viewItem.akt\?p=([0-9]*)$ http://appname.myserver.com/item/$1 [R]

结果总是“在此服务器上未找到请求的 URL /appname/viewItem.akt”,就好像重写规则不存在一样。

我在访问日志中得到的内容是......

[IP address] - - [09/Sep/2011:21:27:37 -0700] "GET /appname/viewItem.akt?p=1018 HTTP/1.0" 404 248

我测试了所有正则表达式卢布拉以确保它们与传入的请求相匹配。

我错过了什么?


如果相关的话,旧应用程序是在 Tomcat 下运行的 Java 应用程序,并且我有一个像这样设置的 ProxyPass...

(我显示这些行被注释掉了,就像我试图让重写规则起作用时那样。)

# ProxyPass /appname http://apps.myserver.com:8080/appname
# ProxyPassReverse /appname http://apps.myserver.com:8080/appname

但这应该没什么关系吧?只要我的重写规则与请求匹配,它就应该可以正确发送,不是吗?

答案1

尝试这个:

RewriteEngine on
RewriteCond %{QUERY_STRING} ^p=([0-9]+)$
RewriteRule ^appname/viewItem.akt$ http://appname.myserver.com/item/%1? [R,L]
  • %1反向引用重写条件
  • ?在替换结束时删除查询字符串的其余部分

但看起来你搞混了mod_rewritemod_proxy你运行的是哪个 Apache 版本?

答案2

您确定已mod_rewrite正确加载吗?

否则,使用指令重写日志根据重写日志级别应该可以帮助您确定在请求页面时是否考虑了 RewriteRule,以及正则表达式是否匹配。

答案3

我不知道这是否适合您的需求,但这些事情也让我抓狂。我总是尽可能地简化。

这在我的测试中似乎有效:
RewriteRule p=([0-9]*)$ http://appname.myserver.com/item/$1

相关内容