【问题标题】:Remove index.php with the GET superglobal from the URL从 URL 中删除带有 GET 超全局变量的 index.php
【发布时间】:2016-04-17 15:52:39
【问题描述】:

我的 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 -> 这将给我 about 控制器,以便显示 about 页面 (MVC)

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

您可以在 htaccess 中看到我正在用我输入的任何内容 ($1) 替换 index.php/?url 但它似乎不起作用,因为当我请求此 url 时:(示例)http://example.com/about 我得到找不到对象!错误 404。当我有 http://example.com 时,我得到了 controller_home 页面。但是,当我输入 http://example.com/home 时,它也会显示错误 404。

如果我这样做:http://example.com/?url=abouthttp://example.com/index.php?url=about 它可以找到并为我提供 about 控制器,因此我猜 htaccess 不会删除 ?url...

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

请帮助我,因为我已经检查了这个错误大约 10 个小时,但我没有找到它为什么会这样,我的朋友有几乎相同的代码,它对他非常有效。

我是 php 的新手,所以它可能是简单的错误... 提前感谢所有提供帮助的人!

【问题讨论】:

  • 首先验证您的.htaccess 是否已启用,方法是在您的.htaccess 顶部放置相同的垃圾(随机)文本,然后查看它是否在您运行时生成500(内部服务器)错误在浏览器中访问您的页面?
  • 是的,我以前做过,现在试过了,效果很好。顺便说一句,这是我的根的样子:gyazo.com/7678d71f467f2a14cd54b565354112de
  • 在规则RewriteRule ^(.+)$ /index.php/?url=$1 [QSA,L] 中的 index.php 之前添加一个斜杠,以确保索引文件取自根目录。
  • 我也这样做了 :) 但是,它没有用。

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


【解决方案1】:

如果您使用的是 .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”时,您希望将“about”传递给 index.php 而不是“/about”,所以“/?”将从 $1 中删除第一个字符位置的 /。我打了问号,只是因为我认为这是最佳做法,因为从技术上讲,您可以获得不以斜杠开头的 HTTP 请求(尽管这违反标准,并且每个浏览器都在开头包含斜杠)。

第四,你不应该在RewriteRule中的index.php之后放一个/(所以它应该是“index.php?url=$1”,而不是“index.php/?url=$1”。查询字符串是分开的从文件名通过“?”而不是“/?”。

【讨论】:

  • 有效!非常感谢您花时间回答我的问题,甚至解释它是如何工作的!我非常感谢 :) 现在我几乎知道为什么它一开始不起作用了,谢谢。
  • 太好了,很高兴为您提供帮助!
【解决方案2】:

试试这个

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]

【讨论】:

  • 没用。另外,感谢所有提供帮助的人
  • 我的朋友,你是个传奇!我可以请你解释一下吗?非常感谢!
  • 乐于助人!我想解释一下,但恐怕我不能。我只是查看了我的一些旧代码并搜索了一个适用于您的情况的重写示例。也许 SO 的其他人能够解释这一点和/或提出更清洁的解决方案。
  • 好吧,没问题。再次感谢。如果有人知道这是如何工作的,请说出来:)
猜你喜欢
  • 2015-05-13
  • 1970-01-01
  • 2016-09-08
  • 2012-12-22
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多