如何使用.htaccess将所有可能的URL放入一个文件中?

时间:2014-03-19 17:57:55

标签: regex apache .htaccess mod-rewrite

我想有一个index.php文件来控制谁可以访问URL访问的每个文件,所以我决定使用.htaccess文件。

我尝试了两条规则:

RewriteRule ^(.*)$ ?get=$1

但是因为它似乎形成一个循环(如anubhava所说)我也尝试过:

RewriteRule ^[^\?](.*)$ ?get=$1

但在这两种情况下,访问?get=hello我得到了" 500内部服务器错误"而不是获得hello值。

为什么呢?即使它是对现有文件的引用,我怎么能将完整的url放到一个文件中?

1 个答案:

答案 0 :(得分:2)

是的,这是正确的行为。由于循环,您将收到500内部错误。由于重写前后的URI模式匹配.*

请记住,只要存在匹配规则,mod_rewrite就会继续执行您的规则。

要解决此循环问题,您需要RewriteCond

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ ?get=$1 [L,QSA]

这基本上意味着仅当请求不是针对有效文件或目录时才执行规则。

编辑:根据您编辑过的问题,请使用以下规则:

Options -MultiViews
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.*)$ ?get=$1 [L,QSA]

这基本上意味着只有在未设置%{ENV:REDIRECT_STATUS}变量时才重写。 (在mod_rewrite模块首次成功重写后,此变量设置为200。)

编辑(通过axelbrz):我还添加了anubhava的Options -MultiViews行来忽略破坏预期行为的apache的内容协商模块。忽略它的另一种可能性是禁用它运行:sudo a2dismod negotiation并重新启动apache。