.htaccess重写不正确的URL

我正在从一个旧的服务器迁移到一个新的网站,在这个过程中,我遇到了一些麻烦,Apache和mod_rewrite。 我有以下.htaccess文件:

RewriteEngine on RewriteRule ^audio/(.*?)/.*?$ audio.php?id=$1 RewriteRule ^books/(.*?)/.*?$ books.php?id=$1 

audio.php和books.php被调用,除了被捕获的variables没有被传递,所以在audio.php重写的情况下,我服务的是audio.php页面,但是$_GET是空的。

为了testing发生了什么,我添加了RewriteRule (.*) test.php?a=$1 ,其中test.php刚刚抛弃了$_GET当我做了$_GET['a']包含'test.php'。

在错误日志中没有任何东西显示出来,而且正确的文件被清楚地显示出来了,重写的工作基本上是正常的,而且configuration已经AllowOverride All我在做什么错了?

我想清楚,这个htaccess文件在旧的服务器上工作。

你应该设置一个高RewriteLogLevel以确保你的规则正在按照你的预期进行处理。

请记住.*? 可能会产生空的匹配,因为*表示0或更多 。 您可能至less要使用+ (so, .+? ),这意味着一个或多个

安美居。 有更好的方式来expression你在找什么。

要匹配,直到下一个斜杠,这应该做的:

 RewriteRule ^audio/([^/]+) /audio.php?id=$1 

虽然,如果它是一个数字ID,你可以更精确:

 RewriteRule ^audio/(\d+) /audio.php?id=$1 

这真的要取决于你在做什么。 什么path传递给原始请求? 它总是/audio/ some_id / other_stuff? 还有什么其他configuration的path与“audio”? 对于表单的请求:

 http://www.example.com/audio/some_id/other_stuff 

你可能会需要一个RewriteRule:

 ReWriteRule ^/audio/(.*)/.*$ /audio.php?id=$1 

我觉得 。*? 没有做你想做的事情。 给这个旋转,看看它做了什么。 你也可以findPerl正则expression式参考指南 。