Mod_Rewrite到/子目录和/子目录/查询

时间:2012-08-10 15:26:20

标签: .htaccess mod-rewrite url-rewriting

我很难进入使用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并按照需要工作。

1 个答案:

答案 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版本的文档)。

相关问题