从URL中删除带有GET超全局的index.php

时间:2016-01-12 21:01:00

标签: php apache .htaccess model-view-controller web

我的htaccess中有这段代码:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -l

RewriteRule ^(.+)$ index.php/?url=$1 [QSA,L]

在PHP中,我抓住当前的网址请求,并将其设为控制器,如果有http://example.com/index.php?url=about - >这将给我关于控制器,所以它显示关于页面(MVC)

现在我的问题是如何从每个页面中删除index.php?url。例如,我想访问about页面,然后我需要它 - > http://example.com/about

你可以在htaccess中看到我用我输入的任何东西($ 1)替换index.php /?url但它似乎没有用,因为当我请求这个url :( example){{3我找不到对象!错误404.当我有http://example.com/about时,我得到了controller_home页面。但是,当我输入http://example.com时,它也会显示错误404。

如果我执行此操作:http://example.com/homehttp://example.com/?url=about它可以查找并向我提供有关控制器的信息,那么我的网址就不会被htaccess删除...

可能是我的php代码中的另一个错误或者是什么?

请帮助我,因为我一直在查看这个错误大约10个小时,我没有找到为什么它的行为,我的朋友有几乎相同的代码,它对他来说很完美。

我是一个新的PHP,所以它可能是简单的bug ... 提前感谢所有帮助的人!

2 个答案:

答案 0 :(得分:2)

如果您正在使用.htaccess文件

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^/?(.+)$ index.php?url=$1 [QSA,L]

如果您正在编辑主apache配置文件(httpd.conf或apache2.conf)。我知道OP正在使用.htaccess但是以防万一有这个问题的其他人看到这个讨论:

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-l

RewriteRule ^/?(.+)$ index.php?url=$1 [QSA,L]

首先,大概你想要测试请求的字符串是否与目录不匹配,不匹配文件,并且不匹配符号链接 - 所以你需要添加一个"!"在RewriteCond标志之前(否定条件)。 Stacked RewriteConds与隐式AND链接,因此检查目录,文件和符号链接是没有意义的(给定的请求字符串不会匹配所有这些条件)。

其次,如果您在主apache配置文件(即/ httpd.conf或apache2.conf)中执行此操作,则需要%{DOCUMENT_ROOT}。如果您在.htaccess文件中执行此操作,则没有必要。

第三,当RewriteRule匹配时,它包含/。大概是当你要求" website.com/about"你想要"关于"传递给index.php而不是" / about",所以" /?"将从$ 1中删除/ in第一个字符位置。我提出问号,只是因为我认为这是最佳做法,因为从技术上讲,你可以获得一个不以斜杠开头的HTTP请求(虽然这会违反标准,每个浏览器在开头都包含一个斜杠)

第四,你不应该在RewriteRule中放一个/之后的index.php(所以它应该是" index.php?url = $ 1&#34 ;, not" index.php /?url = $ 1"。查询字符串通过"?"而不是" /?"与文件名分隔。

答案 1 :(得分:0)

试试这个

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -l

RewriteRule ^(.*)$ http://%1/$1/ [R=301,L]
RewriteRule ^((.*)+)$ index.php?url=$1 [QSA,L]