.htaccess重定向在Apache/2.2.15上不起作用

.htaccess重定向在Apache/2.2.15上不起作用,apache,perl,.htaccess,redirect,mod-rewrite,Apache,Perl,.htaccess,Redirect,Mod Rewrite,我使用的Apache版本是2.2.15 我的.htaccess如下所示: use CGI; my $cgi = CGI_>new(); my $url = $cgi->self_url; my $service_name = $cgi->param('NAME'); # In ideal case $url will hold # myhost.com/myapp/perlcode/cgi_script.pcgi?NAME=del

我使用的Apache版本是2.2.15

我的.htaccess如下所示:

 use CGI;

    my $cgi = CGI_>new();
    my $url = $cgi->self_url;
    my $service_name = $cgi->param('NAME');

    # In ideal case $url will hold 
    # myhost.com/myapp/perlcode/cgi_script.pcgi?NAME=delivery
    # then it substitutes the $url based on the $service_name and redirects
    if ($service_name eq 'delivery') {

        $url =~ s!/myapp/perlcode/cgi_script\.pcgi\NAME=$service_name!/myapp/percode/service!;
        $cgi->redirect($url);
    } elsif ($service_name eq 'order') {
         # does similar operation as above
     }
重新编写引擎打开
重写库/myapp/
重写规则^service/name/(.+)$/perlcode/cgi_script.pcgi?name=$1[L]
根据预期的行为,例如,当我点击短URL时

myhost.com/myapp/service/name/delivery
在浏览器中,应将其转换为

myhost.com/myapp/perlcode/cgi\u script.pcgi?NAME=delivery
然而,我发现这并没有发生,相反,参数只是被附加到短URL中,如下所示

myhost.com/myapp/service/name/delivery?name=delivery
我尝试了
[L,R=301]
[L,QSA,NC]
标志,但它们也在将浏览器URL转换为我不想要的长URL。我希望URL转换能够像在Apache/2.0.52中一样在幕后悄悄地进行

在Perl代码级别(5.14.1版),我看到
$cgi->self\u url
给了我这个意外的短url,并附加了参数名(即
myhost.com/myapp/service/name/delivery?name=delivery

有人能帮忙吗

Perl代码如下所示:

 use CGI;

    my $cgi = CGI_>new();
    my $url = $cgi->self_url;
    my $service_name = $cgi->param('NAME');

    # In ideal case $url will hold 
    # myhost.com/myapp/perlcode/cgi_script.pcgi?NAME=delivery
    # then it substitutes the $url based on the $service_name and redirects
    if ($service_name eq 'delivery') {

        $url =~ s!/myapp/perlcode/cgi_script\.pcgi\NAME=$service_name!/myapp/percode/service!;
        $cgi->redirect($url);
    } elsif ($service_name eq 'order') {
         # does similar operation as above
     }

您只是缺少了
[PT]
passthrough标志,它将修改后的URL重新提交给映射过程


如果没有它,则假定结果是一个文件路径,在该路径中,上下文
?NAME=delivery
毫无意义

我检查了系统中使用的CGI.pm版本。 版本是5.14.1,其中一些子程序的更改比 它们在早期版本中(例如:5.6.1)

由于CGI.pm中子程序sub-url的更改,输出是我不想要的

我认为这不是一个.htaccess问题


一如既往地感谢您的帮助。

我深表歉意。我提到Perl版本是5.14.1。 提供意外输出的CGI.pm版本是3.52,提供预期输出的早期CGI.pm版本是2.752


很明显,CGI模块在2.752和3.52之间经历了一些变化。任何感兴趣的人都可以在这里看看

嗨,博罗丁,还是没有运气!我同时使用了[L,PT]和[PT],但没有注意到任何变化。谢谢。你是如何测试这个的?您将讨论一些Perl代码。请让我们看看它在做什么好吗?可能有用,但我不能首先推荐它。嗨,我已经添加了Perl代码编辑我的第一篇文章,请看一下。的最新版本是4.27。您是从哪里获得v5.6.1和v5.14.1的?此外,我不知道该模块如何对Apache的重写引擎产生任何影响。然而,如果你找到了一个适合你的解决方案,那么很好,doneHi Borodin,我为你的问题添加了另一个答案。谢谢。