Regex 如何使用.htaccess将所有可能的URL放在一个文件中?
我希望有一个index.php文件来控制谁可以访问URL访问的每个文件,因此我决定使用.htaccess文件 我尝试了两条规则:Regex 如何使用.htaccess将所有可能的URL放在一个文件中?,regex,apache,.htaccess,mod-rewrite,Regex,Apache,.htaccess,Mod Rewrite,我希望有一个index.php文件来控制谁可以访问URL访问的每个文件,因此我决定使用.htaccess文件 我尝试了两条规则: RewriteRule ^(.*)$ ?get=$1 但由于它似乎形成了一个循环(正如anubhava所说),我也尝试了: RewriteRule ^[^\?](.*)$ ?get=$1 但是在这两种情况下,访问?get=hello我得到的是“500内部服务器错误”,而不是hello值 为什么??即使是对现有文件的引用,我如何将完整url保存到一个文件中?是的,这
RewriteRule ^(.*)$ ?get=$1
但由于它似乎形成了一个循环(正如anubhava所说),我也尝试了:
RewriteRule ^[^\?](.*)$ ?get=$1
但是在这两种情况下,访问?get=hello
我得到的是“500内部服务器错误”,而不是hello
值
为什么??即使是对现有文件的引用,我如何将完整url保存到一个文件中?是的,这是正确的行为。由于循环,您将获得500个内部错误。因为重写前后的URI模式是匹配的 记住,只要有匹配的规则,mod_rewrite就会继续执行您的规则。 要克服此循环问题,您需要
重写cond
:
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 module首次成功重写后,此变量设置为200)
EDIT(axelbrz):我还添加了anubhava的
选项-MultiViews
行,以忽略破坏预期行为的apache内容协商模块。另一种可以忽略它的方法是禁用它运行:sudoa2dismod协商
并重新启动apache。谢谢,但我想得到所有的可能性,而不是那些以“?”开头的可能性,所以我试着重写规则^[^\?](.*)$?get=$1,还得到了500个错误。我将对问题进行更具体的编辑。还要注意[L]
,@axelbrz:是的,请编辑您的问题,因为查询参数需要不同的机制,而不是重写规则
。我建议的答案仍然可以很好地回答您编辑的问题。这似乎是因为Apache的内容协商。我将尝试禁用它并再次检查它。