我正在使用的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
}
答案 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