首页 > 解决方案 > 如何使用 htaccess 和 php 避免错误变量

问题描述

大家好,我是stackoverflow的新手,所以这是我的问题

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

如果有这个 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]

我的问题是

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

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

那么我该如何解决...如果我在 url 显示 404 中键入任何错误或不存在的 var?

标签: php.htaccess

解决方案


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

例如:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+/[^/]+/?)$ /controller.php?id=$1 [QSA,L]

因此,只有形式的请求/<something>/<something>/(尾随斜杠可选)被路由到您的控制器。其他任何东西都会自然地落入404(除非它碰巧映射到物理文件)。

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

如果您对正则表达式有更多限制,那么您可能可以避免文件系统检查。

顺便说一句,在您原来的 regex^(.*)/?$中,尾随/?是完全多余的,因为捕获子.*模式是greedy


更新:

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

啊,好的,这似乎会使我上面的答案不正确。但这也与此无关.htaccess?正如评论中所指出的,这并没有真正的意义。(?)


在旁边:

如果有这个 php 控制器

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

我认为这是非常类似于伪的代码......$_GET['var1']从哪里来$_GET['var2']?你只是传递$_GET['id']controller.php?


推荐阅读