PHP MVC .htaccess - 获取URL参数并隐藏index.php的最佳实践

时间:2014-11-28 12:51:08

标签: php apache .htaccess mod-rewrite http-status-code-404

我自己制作PHP MVC。我在网上看了很多关于.htaccess的信息,但对我来说这仍然很复杂。我的公共文件夹中有index.php,这是应用程序的入口点。这是我的目录结构:

  • 应用
    • 控制器
    • 模型
    • ...
    • 公开
      • JS​​
      • IMG
      • index.php< =入口点
      • .htacccess
  • 框架
    • 路由器
    • 会话
    • FrontController
    • ...

所以在公共文件夹中我只有index.php和.htaccess文件。我想做的是:

  1. 每个请求指向index.php
  2. 当用户输入http://localhost/myApp/加载网址http://localhost/myApp时(最后没有斜线)
  3. 我想在网址中禁用index.php(主页除外)。为清楚起见,以下是一个例子: 如果用户输入http://localhost/myApp/index.php,则网址正常。但当他输入http://localhost/myApp/index.php/user/Chris时,我想要显示一个错误页面。相反,我只希望这个http://localhost/myApp/user/Chris能够正常工作。
  4. 我也想知道从URL访问控制器,模型和参数的正确方法是什么。我知道$_SERVER['PHP_SELF']$_SERVER['SCRIPT_NAME']始终存在,但我不能依赖$_SERVER['PATH_INFO']$_SERVER['REQUEST_URI']因为它们可能不存在,对吧?我在substr($_SERVER['PHP_SELF'], strlen($_SERVER['SCRIPT_NAME']) + 1);之后使用http://localhost/myApp来获取内容。

    这是我到目前为止写的.htaccess RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]

    这段代码似乎做了我想要的一些事情,但这还不够。当我输入http://localhost/myApp/index.php/user时,它仍然有效,而不是给出错误。

    顺便说一下,显示404找不到页面的最佳方法是什么?使用htaccess,还是使用php?此外,当您的网站中有数百万个404未找到的网页时,SEO点会发生什么?怎么处理?因为有这么多页面有相同的内容,你会受到惩罚吗?

    提前致谢。

2 个答案:

答案 0 :(得分:0)

我也制作了自己的MVC框架。 它分为三个部分:

  • 阻止直接访问index.php
  • 防止重写现有文件(对于image / css / js / font文件很有用)
  • 正确的网址重写

就我而言,我选择用PHP解析URL而不是.htaccess。 因此,所有URL都放在$ _GET [' uri']中,其他获取数据由Apache追加(QSA标志)

这里是代码:

RewriteEngine on
RewriteRule ^index.php - [END,R=404]    #prevent direct access

RewriteCond %{REQUEST_FILENAME} -f [OR] #if file exists
RewriteCond %{REQUEST_FILENAME} -d      #or directory exists
RewriteRule . - [END,QSA]               #do nothing

RewriteRule ^(.*)/$ index.php?uri=$1 [END,QSA] #all without the ending slash
RewriteRule ^(.*)$ index.php?uri=$1 [END,QSA]  #all (no ending slash)

答案 1 :(得分:0)

我知道这个问题很老,但相信它应该得到更详细的答案。该过程在代码注释中进行了解释。

RewriteEngine On

# If you decide to run your app from the domain root, then strip out "myApp/"

RewriteBase /myApp/

# First, trim all trailing slashes.

RewriteRule ^(.*)/$ $1 [R=301,L]

# Next, prevent access to URIs starting with index.php.
# Note: I generally recommend that you leave this out and let
#       your app handle redirects from index.php.

RewriteCond %{THE_REQUEST} /index\.php(?:.*) HTTP/1.1 [NC]
RewriteRule ^ - [R=404,L]

# Lastly, pipe requests that do not match existing files to index.php.
# This can be done in several ways, including the one you tried.
# Uncomment the one the works best for you.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# RewriteRule ^ index.php [L]
# RewriteRule ^(.*)$ index.php/$1 [L]
# RewriteRule ^(.*)$ index.php?request=$1 [QSA,L]

在访问请求的URI方面,最后一条规则最容易使用,通常最可靠。我更喜欢使用第一个,并使用REQUEST_URI。第二种情况也是如此。使用它非常可靠 - 我不知道任何服务器没有向REQUEST_URI全局提供$_SERVER。但是,如果是这种情况,第三种选择将是最好的。

关于404s,让应用程序处理它们总是更好。这为您提供了所需的所有灵活性,特别是在提供基于不存在的请求的建议时。只要他们发送正确的标题,谷歌就不会因为存在许多404而惩罚你。但是,如果谷歌通过索引您的实际应用/网站来吸收大部分404,那么它很可能会。因此,您的应用应该聪明,并确保将Google重定向到正确的页面。这使得Google的应用/网站布局非常清晰,并且可以了解正在发生的事情。