我想有一个index.php文件来控制谁可以访问URL访问的每个文件,所以我决定使用.htaccess文件。
我尝试了两条规则:
RewriteRule ^(.*)$ ?get=$1
但是因为它似乎形成一个循环(如anubhava所说)我也尝试过:
RewriteRule ^[^\?](.*)$ ?get=$1
但在这两种情况下,访问?get=hello
我得到了" 500内部服务器错误"而不是获得hello
值。
为什么呢?即使它是对现有文件的引用,我怎么能将完整的url放到一个文件中?
答案 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。