我正在将网站从即将关闭的旧服务器迁移到新服务器,在此过程中,我遇到了 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=$1
test.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 正则表达式参考指南有帮助的。