【发布时间】:2016-06-23 16:43:00
【问题描述】:
我使用的 Apache 版本是 2.2.15。
我的 .htaccess 如下所示:
RewriteEngine on
RewriteBase /myapp/
RewriteRule ^service/name/(.+)$ /perlcode/cgi_script.pcgi?NAME=$1 [L]
按照预期的行为,例如,当我点击短 URL 时,
myhost.com/myapp/service/name/delivery
在浏览器中,应该转换成
myhost.com/myapp/perlcode/cgi_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_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
}
【问题讨论】:
标签: apache perl .htaccess redirect mod-rewrite