我很难进入使用mod_rewrite。我已经在这里玩了大约一个小时的谷歌搜索,但似乎没有什么工作。我想做的是改变
example.com/species.php进入example.com/species
还有
example.com/species.php?name=frog into example.com/species/frog。
使用
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^species/(.*)$ /species.php?name=$1
我可以将example.com/species.php?name=frog显示为example.com/species/frog,并使用
RewriteRule ^species/ /species.php
我可以将example.com/species.php显示为example.com/species/,但我无法让它们同时工作。
此外,没有尾部斜杠的example.com/species总是作为404出现
我已经考虑过制作一个/ species /目录来解决任何问题,但我宁愿对一个species.php文件有一些规则。任何帮助都会很高兴得到赞赏!
编辑(因为我无法再回答8个小时的问题):
我似乎解决了我的两个问题。我将.htaccess改为:
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^species/(.*)$ /species.php?name=$1
RewriteRule ^species/?$ /species.php
第二个RewriteRule成功地将example.com/species重定向到example.com/species.php,同时让另一个RewriteRule同时工作。
但是,如果我输入带有斜杠的example.com/species/,它将被读作example.com/species.php?name=并因为没有提交名称而会抛出错误,所以我刚刚添加了
if(isset($_GET['name']) && empty($_GET['name'])) {header('location: http://example.com/species');}
因此,如果我使用example.com/species/,它将重定向到/ species并按照需要工作。
答案 0 :(得分:1)
如果您在第一个RewriteRule中将*
(匹配零或更多)更改为+
(匹配一个或多个),那么如果尾部斜杠是,则应停止查看species.php?name=
使用
这是因为+
将要求在斜杠后出现某些内容,否则规则将不匹配。然后你的第二个RewriteRule将匹配,因为它以可选的斜杠结束,但不会将name=
查询字符串添加到目标URL。
您可能还希望在第一个规则之后添加[L]
标志(last),因为如果第一个规则匹配,则不需要执行第二个规则。 (请注意,这不会停止在生成的重定向URL上运行RewriteCond和RewriteRule测试,该URL必须像其他任何请求一样通过.htaccess文件。)
请参阅Reference Documentation for mod_rewrite in Apache 2.4(或查看您实际使用的Apache版本的文档)。