从URL中删除带有GET superglobal的index.php


Remove index.php with the GET superglobal from the URL

我的htaccess中有以下代码:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^(.+)$ index.php/?url=$1 [QSA,L]

在PHP中,我获取当前的url请求,并将其作为控制器,因此如果存在http://example.com/index.php?url=about->这会给我关于控制器,这样它就会显示关于页面(MVC)

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

你可以在htaccess中看到,我正在替换index.php/?url,无论我键入什么($1),但它似乎不起作用,因为当我请求这个url时:(示例)http://example.com/about找不到对象!错误404。当我http://example.com我得到控制器主页。但是,当我键入http://example.com/home它还显示错误404。

如果我这样做:http://example.com/?url=about或http://example.com/index.php?url=about它的工作找到并给我关于控制器所以?网址没有被htaccess删除我想。。。

这可能是我的php代码中的另一个错误吗?

请帮帮我,因为我已经查看了这个错误大约10个小时,我不知道为什么它会这样,我的朋友有几乎相同的代码,它非常适合他。

我是php的新手,所以这可能是一个简单的bug。。。提前感谢所有提供帮助的人!

如果您使用的是.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标志之前添加一个"!"(以否定条件)。堆叠重写字符串使用隐式AND链接,因此检查目录、文件和符号链接没有意义(给定的请求字符串不符合所有这些条件)。

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

第三,当RewriteRule匹配时,它包含/。据推测,当您请求"website.com/about"时,您希望将"about"传递给index.php,而不是"/about",因此"/?"将从$1中删除第一个字符中的/。我打了个问号,只是因为我认为这是最好的做法,因为从技术上讲,你可以得到一个不以斜杠开头的HTTP请求(尽管这违反了标准,每个浏览器的开头都包含一个斜杠)。

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

试试这个

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]