译自http://fellowtuts.com/yii/hide-or-remove-basicweb-from-url-in-yii-2-0/

yii是一个非常好的框架,它会自动的做许多事情。我们知道,默认的yii安装会使网站通过类似这样的URL“http://www.example.com/basic/web/index.php”来访问,或者类似这样,但是在生产环境中你也许希望从URL中隐藏或移除basic/web,使得系统能以更适应SEO的友好的URL来访问。

在虚拟专用服务器或是专用主机环境中,按yii2.0官方文档中推荐的Apache配置,把basic/web 设置成服务器的document root是没有问题的,因为我们对虚拟主机配置或是Apache的httpd.conf文件是有设置权限的。但是在共享或者代理主机环境中,我们会受限于配置和目录结构,因此不能改变document root。尽管如此,相信我,我们仍然可以隐藏“basic/web” 或者 “yii2-app-basic/web”或任何前缀可以通过这样的URL格式http://example.com/controller/action 来访问系统。

首先,我们要设置config/web.php,将“enablePrettyUrl”为TRUE,“showScriptName”FALSE来保证yii允许美化的URL。如果你不知道应该如何进行上述设置,请参考这篇文章

$config = [
...
'components' => [
'urlManager' => [
                    'enablePrettyUrl' => true,
                    'showScriptName' => false,
],
...

然后在yii的web目录下添加.htaccess文件,写入下述重写规则

Options +FollowSymLinks
IndexIgnore */*
 
RewriteEngine on
 
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
 
# otherwise forward it to index.php
RewriteRule . index.php

关于上述配置,我们可以从大量关于yii的文档中读到。让我们继续完成剩余的工作。


移动YII安装目录和文件

我假设你的服务器文件结构(左)和YII安装目录结构(右)类似于下面这样

wKiom1VRdmqAkO68AACiqOHFJuM284.jpg


我的服务器结构中public_html和www是可以被直接访问的,将YII安装目录下除了web文件夹以外的所有文件都移动到上面展示的同级服务器目录下。要注意两边都有mail文件夹,因此我们可以把yii对应mail目录下的layouts文件夹至于服务器mail目录中。


然后,将yii安装文件web目录下的所有文件移动或拷贝到服务器的public_html中。现在移除basic/web和index.php来访问系统吧。


我们总结一下yii2.0中为了隐藏和移除URLbasic/web我们做了哪些工作。我们修改了config中的components配置来隐藏index.php,用“htaccess”把不属于目录或文件的请求定向到index.php。然后把整个yii文件拷贝至public_html的同一层(我们不需要愚蠢的basic / yii2-app-basic文件夹),还要把web中的所有东西拷贝到public_html。通过这一步,所有的脚本不直接暴露在web上,只有index.php会被暴露,以上。