Simple Mod Rewrite

5

我正在尝试创建一个 mod rewrite 规则,以便简单地将这些链接转换为:

/index.php?page=home
/?page=home

转换成

/home

有人能向我展示如何完成这个吗?顺便问一下,有什么好的资源可以了解 mod_rewrite 吗?到目前为止,我最大的困难是看不到任何调试方式;事情要么能够工作,要么不能。

3个回答

6

有很多种方法可以实现这一点。这个方法将规则应用于任何不存在的文件:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1 [L]

编辑:您可能需要在顶部添加RewriteEngine on,并将其放置在您的Web文档根目录中的.htaccess文件中。当然,所有这些都取决于您的Web主机是否允许使用htaccess(mod_rewrite)以及规则覆盖文件是否应该命名为.htaccess。不过,这两者都很常见,所以不应该成为问题。


谢谢,这正是我所需要的。但你说的“将规则应用于任何不存在的文件”是什么意思呢? - Serg Chernata
当请求不匹配文件系统上的文件(第1行)或文件系统上的目录(第2行)时,才会应用RewriteRule行。换句话说,这仍然允许您提供任何实际存在并通过其他所有内容传递到index.php的文件。 - Matt Stein

4
如果我理解正确的话,你希望你的最终用户输入 example.com/home 并将其重写为 /index.php?home
RewriteEngine On
# /home or / get redirected...
RewriteRule ^(home)?$ /index.php?page=home [L,QSA]

要进行调试,您可以启用RewriteLog。但是,正如评论中建议的那样,它仅应用于调试。在生产中,最好禁用它或将级别设置得非常低。

RewriteLog "/path/to/logs/rewrite.log"
# Increase the log level (default 0, >4 gets pretty verbose) 
RewriteLogLevel 3 

1
小提示 - RewriteLogLevel 3 对于严格的重写调试来说过于低了 - 它只会让您了解正在发生什么,而不会详细说明。要查看详细信息,请使用Level 9 - 这样更加冗长。 - LazyOne
1
我会在这个答案中加入一个严重的警告关于RewriteLog,因为如果你“忘记”它,它可能会成为一个资源猪,而且它真的不应该在更高级别上长时间运行,因为那个文件会很快变得几个GB大... - sg3s
@sg3s 同意 - 我在答案中添加了一条注释。 - Michael Berkowski

3
RewriteRule .*\?page=(\w+)$ /$1/ [NC]

这应该可以解决问题,但也许你需要更明确哪些情况需要工作?

这是一个网站,你可以阅读关于htaccess的相关内容。

http://corz.org/serv/tricks/htaccess2.php


有趣的方法,谢谢。那么在这种情况下就不需要 RewriteCond 了吗? - Serg Chernata
重新阅读您编辑后的问题,我意识到这不是您想要做的... 有关美观的URL,请查看Matts答案。 我提供的网站仍然是一个不错的资源 :) - sg3s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接