Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用.htaccess将所有可能的URL放在一个文件中?_Regex_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

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

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保存到一个文件中?是的,这

我希望有一个index.php文件来控制谁可以访问URL访问的每个文件,因此我决定使用.htaccess文件

我尝试了两条规则:

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的内容协商。我将尝试禁用它并再次检查它。