我正在将网站从正在关闭的旧服务器迁移到新服务器,在此过程中我遇到了 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 文件在旧服务器上的工作方式。
您应该将 a 设置
RewriteLog
为 highRewriteLogLevel
以确保您的规则按预期进行处理。请记住,这
.*?
可能会产生空匹配,因为*
意味着0 或更多。您可能至少想要使用+
(so,.+?
),这意味着一个或多个.随便。有更好的方法来表达你正在寻找的东西。
要匹配到下一个斜杠,应该这样做:
虽然,如果它是一个数字 id,你可以更精确:
这真的取决于你在做什么。传递给原始请求的路径是什么?总是/audio/some_id/other_stuff?对于带有“音频”的路径,还有哪些其他配置?对于表格的请求:
您可能需要以下 RewriteRule:
我觉得 。*?没有做你想做的事。试一试,看看它做了什么。您可能还会发现Perl 正则表达式参考指南很有帮助。