PHP .htaccess URL重写参数不正确

3
我是一位有用的助手,可以为您翻译文本。
我遇到了一个使用.htaccess RewriteEngine的奇怪问题。
我有这个简单的规则:
RewriteEngine On
RewriteRule ^(.\*)/(.\*).php$ pages/test.php?lang1=$1&page1=$2 [L]

在 pages/test.php 中,我放置了以下 PHP 代码:
echo('lang: '.$_GET['lang1'].'< br />');    
echo('page: '.$_GET['page1'].'< br />');    
echo('querystring: '.$_SERVER['QUERY_STRING']);

因此,当调用http://test.local/en-US/something.php时,我期望看到类似以下的内容:

lang: en-US    
page: something    
querystring: lang1=en-US&page1=something

相反,这是我从页面得到的奇怪输出:
lang: pages    
page: test    
querystring: lang1=pages&page1=test

有人能帮我吗?

2个回答

2
您得到这个结果是因为您创建了一个循环,请尝试使用以下代码行:
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/pages/test\.php$
RewriteRule ^(.*)/(.*)\.php$ /pages/test.php?lang1=$1&page1=$2 [L]

它像魔法一样运行,谢谢!但我真的不明白为什么它要循环执行... - Cuttlefish
1
你重定向 ^(.*)/(.*)\.php$pages/test.php 也符合该模式。无论如何,很高兴它现在可以工作了 :) - Oussama Jilal

1

您也可以使用QSA标志:

RewriteRule ^(.*)/(.*).php$ pages/test.php?lang1=$1&page1=$2 [QSA,L]

当替换URI包含查询字符串时,RewriteRule的默认行为是丢弃现有的查询字符串,并用新生成的查询字符串替换它。使用[QSA]标志会导致查询字符串被合并。

http://httpd.apache.org/docs/current/rewrite/flags.html


谢谢,我尝试了QSA标志,但结果是:lang1=pages&page1=test&lang1=en-US&page1=dfsdfasdf。我猜这是由于上面的循环问题引起的... - Cuttlefish
我在这里重现了你的问题,并得到了正确的结果。L标志通常会结束任何进一步的处理。如果其他答案也可以解决问题,那也没问题 :) - Maurice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接