1

我很难开始使用 mod_rewrite。我已经在谷歌上搜索了大约一个小时,但似乎没有任何效果。我想要做的是将
example.com/species.php 更改为 example.com/species
并将
example.com/species.php?name=frog 更改为 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 并按需要工作。

4

1 回答 1

1

如果您在第一个 RewriteRule 中将*(匹配零个或多个)更改为+(匹配一个或多个),那么您应该停止查看species.php?name=是否使用了尾部斜杠。

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

您可能还想[L]在第一条规则之后添加标志(最后一个),因为如果第一条规则匹配,则不需要执行第二条规则。(请注意,这不会停止在生成的重定向 URL 上运行 RewriteCond 和 RewriteRule 测试,它必须像任何其他请求一样通过 .htaccess 文件。)

请参阅Apache 2.4 中 mod_rewrite 的参考文档(或查看您实际使用的 Apache 版本的文档)。

于 2012-08-18T23:00:15.597 回答