如何使用htaccess和php避免假变量
嗨,伙计们,我是stackoverflow的新手,所以这是我的问题 我有一个控制器文件php和我的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
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”。非常感谢怀特先生,我用你的代码解决了我的问题,非常感谢怀特先生,我用你的代码解决了我的问题,谢谢