Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.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
如何使用htaccess和php避免假变量_Php_.htaccess - Fatal编程技术网

如何使用htaccess和php避免假变量

如何使用htaccess和php避免假变量,php,.htaccess,Php,.htaccess,嗨,伙计们,我是stackoverflow的新手,所以这是我的问题 我有一个控制器文件php和我的htaccess 如果你有这个php控制器 if ($_GET['var1'] and $_GET['var2']){include_once('file.php')} if ($_GET['var1'] and $_GET['var2']){include_once('file.php')} 这是htaccess RewriteEngine On RewriteCond %{REQUEST_F

嗨,伙计们,我是stackoverflow的新手,所以这是我的问题

我有一个控制器文件php和我的htaccess

如果你有这个php控制器

if ($_GET['var1'] and $_GET['var2']){include_once('file.php')}
if ($_GET['var1'] and $_GET['var2']){include_once('file.php')}
这是htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/?$ /controller.php?id=$1 [QSA,L]
我的问题是

如果我输入这是一个真实的路径,那么就可以了。 但是如果我输入这个url,需要显示错误404,但仍然显示file.php,因为有var1和var2

-------------real-real-non-exist--    
www.site.com/var1/var2/hjwuwjais/

所以我如何解决它。。。如果我在url show 404?中键入任何虚假或不存在的变量,以填补问题中缺失的空白,那么您可能只应该在正好有两个路径段时才重写到控制器

例如:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+/[^/]+/?)$ /controller.php?id=$1 [QSA,L]
因此,只有形式为
//
(尾部斜杠可选)的请求才会路由到控制器。其他任何东西都会自然地通过404(除非它恰好映射到物理文件)

这将处理可选的尾随斜杠,尽管理想情况下您应该在URL中包含或省略它

如果您在regex中的限制更严格,那么您可能可以避免文件系统检查

顺便说一句,在原始正则表达式中,
^(.*)/?$
,后面的
/?
是完全多余的,因为捕获子模式
*
是贪婪的


更新:

但是如果我键入
www.example.com/var1/var2/hjwwjais/
这个url需要显示错误404,但仍然显示
file.php
,因为有
var1
var2

啊,好吧,这似乎会使我上面的回答不正确。但这也与
.htaccess
无关?正如评论中提到的,这并没有什么意义。(?)


旁白:

如果你有这个php控制器

if ($_GET['var1'] and $_GET['var2']){include_once('file.php')}
if ($_GET['var1'] and $_GET['var2']){include_once('file.php')}

我假设这是非常伪似的代码。。。
$\u GET['var1']
$\u GET['var2']
来自哪里?您只是将
$\u GET['id']
传递给
controller.php

填补问题中缺失的空白,也许您应该只在恰好有两个路径段时才重写到控制器

例如:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+/[^/]+/?)$ /controller.php?id=$1 [QSA,L]
因此,只有形式为
//
(尾部斜杠可选)的请求才会路由到控制器。其他任何东西都会自然地通过404(除非它恰好映射到物理文件)

这将处理可选的尾随斜杠,尽管理想情况下您应该在URL中包含或省略它

如果您在regex中的限制更严格,那么您可能可以避免文件系统检查

顺便说一句,在原始正则表达式中,
^(.*)/?$
,后面的
/?
是完全多余的,因为捕获子模式
*
是贪婪的


更新:

但是如果我键入
www.example.com/var1/var2/hjwwjais/
这个url需要显示错误404,但仍然显示
file.php
,因为有
var1
var2

啊,好吧,这似乎会使我上面的回答不正确。但这也与
.htaccess
无关?正如评论中提到的,这并没有什么意义。(?)


旁白:

如果你有这个php控制器

if ($_GET['var1'] and $_GET['var2']){include_once('file.php')}
if ($_GET['var1'] and $_GET['var2']){include_once('file.php')}

我假设这是非常伪似的代码。。。
$\u GET['var1']
$\u GET['var2']
来自哪里?您只是将
$\u GET['id']
传递给
controller.php

对我来说,显示404并保持正常路径毫无意义。或者显示404,或者包含文件并忽略第三个参数。您是对的,但是如果参数不存在,如何重新检测到404?重写规则中唯一设置的GET参数是
id
。没有“var1”和“var2”。对我来说,显示404并保持正常路径是没有意义的。或者显示404,或者包含文件并忽略第三个参数。您是对的,但是如果参数不存在,如何重新检测到404?重写规则中唯一设置的GET参数是
id
。没有“var1”和“var2”。非常感谢怀特先生,我用你的代码解决了我的问题,非常感谢怀特先生,我用你的代码解决了我的问题,谢谢