.htaccess 重写未获取正确的 URL

.htaccess 重写未获取正确的 URL

我正在将网站从即将关闭的旧服务器迁移到新服务器,在此过程中,我遇到了 Apache 和 mod_rewrite 的一些问题。我有以下 .htaccess 文件:

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

除了未传递捕获的变量外,audio.php 和 books.php 都按预期被调用,因此在 audio.php rewriterule 的情况下,我被提供给 audio.php 页面但是它$_GET是空的。

为了测试发生了什么,我添加了RewriteRule (.*) test.php?a=$1test.php 刚刚转储的位置,$_GET其中$_GET['a']包含“test.php”。

错误日志中没有显示任何内容,并且由于提供了正确的文件,因此重写显然基本正常,而配置中AllowOverride All我做错了什么?

我想明确地说明这个 htaccess 文件在旧服务器上是否可以正常工作。

答案1

您应该设置一个RewriteLog较高的值RewriteLogLevel来确保您的规则按照预期进行处理。

请记住,这.*?可能会产生一个空匹配,因为这*意味着0 个或更多. 你可能至少想使用+(so, .+?),这意味着一个或多个

无论如何。有更好的方式来表达你在寻找的东西。

为了匹配直到下一个斜线,应该这样做:

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

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

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

答案2

这实际上取决于你到底要做什么。传递给原始请求的路径是什么?它总是 /audio/some_id/other_stuff 吗?对于包含“audio”的路径,还有什么其他配置?对于以下形式的请求:

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

您可能需要以下 RewriteRule:

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

我认为 .*? 并没有达到你想要的效果。试试看,看看效果如何。你还可能会发现Perl 正则表达式参考指南有帮助的。

相关内容