.htaccess重定向无法在Apache / 2.2.15上运行

时间:2016-03-09 10:46:35

标签: apache perl .htaccess redirect mod-rewrite

我正在使用的Apache版本是2.2.15。

我的.htaccess如下所示:

RewriteEngine on
RewriteBase /myapp/

RewriteRule  ^service/name/(.+)$   /perlcode/cgi_script.pcgi?NAME=$1  [L]

根据预期的行为,当我点击短网址时,

myhost.com/myapp/service/name/delivery

在浏览器中,它应该转换为

myhost.com/myapp/perlcode/cgi_script.pcgi?NAME=delivery

但是,我发现没有发生这种情况,而是将参数添加到短网址中,如下所示

myhost.com/myapp/service/name/delivery?NAME=delivery

我尝试了[L,R=301][L,QSA,NC]个标记,但他们也将浏览器网址转换为我不想要的长网址。我希望URL转换在场景后面静静地进行,就像以前在Apache / 2.0.52

中一样

在Perl代码级别(版本5.14.1),我看到$cgi->self_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
     }

3 个答案:

答案 0 :(得分:2)

您只是错过了[PT] passthrough 标志,该标志会将修改后的网址重新提交到映射过程

没有它,结果被假定为文件路径,其中上下文?NAME=delivery没有意义

答案 1 :(得分:1)

我查看了系统中使用的CGI.pm版本。 版本是5.14.1,其中一些子例程发生了变化 它们是早期版本(例如:5.6.1)。

由于CGI.pm中子例程子URL的更改,输出就像我不想要的那样。

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

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

答案 2 :(得分:0)

道歉。我提到Perl版本为5.14.1。 给我意想不到的输出的CGI.pm版本是3.52,而早期的CGI.pm版本给出了预期的输出是2.752。

很明显,CGI模块在2.752和3.52之间经历了几次变化。任何有兴趣的人都可以看看http://cpansearch.perl.org/src/MARKSTOS/CGI.pm-3.52/Changes