最近我试图构建一些MVC应用程序,没有任何框架来更好地理解MVC模式。直到现在我已经解决了我遇到的每一个问题但是......
很常见的是让你的网址看起来更漂亮"
例如
www.somesite.com/controller/method
而不是www.somesite.com/index.php?c=1&m=2
。
我通过将htacces瞄准变量来实现这一目的。
在htaccess中......
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
这有效,直到有人试图重写变量" url"。
基本上如果有人输入www.somesite.com/controller/method?url=1
我的应用程序将弹出一个错误页面,因为我正在解析/
之后的所有内容,并按名称调用特定的控制器和方法(如果不存在则弹出错误页面)。
所以我想知道是否有更好的方法来做到这一点或避免这种行为的方式
谢谢:)
在过去的几个小时里,我试图找到更好的解决方案。我以为我可以将我的url放入Enviromental变量而不是变量。
所以我尝试了像
这样的命令
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ index.php [E=URL:$1,QSA]
不幸的是$_SERVER["URL"]
是空白的......
如果有人可以帮我解决这段代码,我会很高兴:)谢谢你
好的,要说清楚,我会添加几个例子
我现在的htacces看起来像这样
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ index.php?url=$1 [QSA]
所以,如果有人去www.somesite.com/foo/bar
我将检查$_GET["url"]
,然后将其展开explode("/", filter_var(rtrim($_GET["url"], "/"), FILTER_SANITIZE_URL))
现在我的数组看起来像[0=>foo 1=>bar]
这意味着在我的代码中我将尝试调用名为foo
的控制器,然后在此类中调用名为bar
的方法
如果用户尝试访问www.somesite.com/foo/bar/fee/faa
,fee
和faa
将作为参数传递到课程bar
中的方法foo
。
所以这只是一个例子,它是如何工作的。我的问题就像我说有人试图访问时说的那样www.somesite.com/foo?url=0
。然后我的脚本将尝试处理$_GET["url"]
,结果将不会是foo
,而是0
,因为?url=0
会重写url
的值,该值最初设置在我的0
中.htacces。所以我的脚本会尝试调用名为error404
的控制器,如果不存在则会弹出QUERY_STRING
。我已经尝试在htacces中通过 SELECT * FROM A
INNER JOIN B
ON A.ID = B.ID
AND B.TIMESTAMP = (SELECT MAX(TIMESTAMP) FROM B b2 WHERE b2.ID = A.ID)
忽略这个特定的变量,但在我看来这似乎是一个愚蠢的解决方案。现在我想坚持设置evniromental变量而不是获取变量或者如果有更好的方法来实现这一点:)谢谢
答案 0 :(得分:0)
您当前的设置依赖于$_GET
来获取核心信息,但是,正如您所面对的那样,该变量是从用户输入中填充的,因此任何人都可能会无意中弄乱您的路由。
自定义路由器的典型Apache配置如下所示(this snippet is from CakePHP/2.x):
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
正如您所看到的那样,它不会添加自己的GET变量,它只会让现有的变量通过。原始网址就在$_SERVER
内,您不需要指示Apache将其复制到重定向的网址中。
我理解你想要$_SERVER['REQUEST_URI']
,但你可以使用常用方法窥视数组:print_r($_SERVER)
,var_dump($_SERVER)
,phpinfo()
......