2012-08-10 97 views
1

我很难开始使用mod_rewrite。我一直在这里约一小时谷歌搜索的东西,但似乎没有任何工作。我想要做的就是改变
example.com/species.php到example.com/species

example.com/species.php?name=frog到example.com/species/frog。Mod_Rewrite到/子目录和/子目录/查询

使用

Options +FollowSymlinks 
RewriteEngine on 

RewriteRule ^species/(.*)$ /species.php?name=$1 

我能得到example.com/species.php?name=frog显示为example.com/species/frog,并与

RewriteRule ^species/ /species.php 

我可以得到例如.com/species.php显示为example.com/species/,但我无法让他们两人同时工作。
此外,没有结尾斜杠的example.com/species总是以404的形式出现。
我认为只是让一个/种类/目录来解决任何问题,但我宁愿只有一个物种的一些规则.php文件。任何帮助将很乐意被赞赏!

编辑(因为我不能回答我自己8个多小时的问题):

我似乎有固定我的两个问题。我改变了我的.htaccess到:

Options +FollowSymlinks 
RewriteEngine on 

RewriteRule ^species/(.*)$ /species.php?name=$1 
RewriteRule ^species/?$ /species.php 

第二重写规则成功地重定向example.com/species,同时使其他重写规则,同时努力example.com/species.php。
但是,如果我在example.com/species/中输入了斜线,则它将被读为example.com/species.php?name=,并且会因为没有提交名称而引发错误,所以我只是添加了

if(isset($_GET['name']) && empty($_GET['name'])) {header('location: http://example.com/species');} 

因此,如果我使用example.com/species/,它会重定向到/物种并按需要工作。

回答

1

如果你在第一次重写规则改变*(匹配零个或多个)的+(匹配一个或多个),那么你应该再看到species.php?name=如果使用尾随斜线。

这是因为+将要求某些东西出现在斜线后面,否则规则将不匹配。然后你的第二个RewriteRule将匹配,因为它以可选的斜杠结束,但不会将name=查询字符串添加到目标URL。

您可能还希望在第一条规则后添加[L]标志(上一个),因为如果第一条规则匹配,则不需要执行第二条规则。 (请注意,这不会停止的RewriteCond重写规则和试验正在对所产生的重定向URL,这将不得不通过.htaccess文件就像任何其他的要求运行。)

Reference Documentation for mod_rewrite in Apache 2.4(或查看的文档你实际使用的Apache版本)。