我有一个codeigniter网站,它有一个破碎的链接结构。它在我温暖的当地环境中工作正常。但是,当我部署到我的共享主机站点时,链接停止工作。初始页面正常加载。我的导航栏看起来像:
<a class="brand" href="#">myproject</a>
<div class="nav-collapse">
<ul class="nav">
<li class="active"><a href="#">Home</a></li>
<li ><a href="http://localhost/projectname/basecontroller/Facts">Facts</a></li>
<li ><a href="http://localhost/projectname/basecontroller/about">About</a></li>
<li ><a href="http://localhost/projectname/basecontroller/contact">Contact</a></li>
<!--<li ><a href="http://localhost/projectname/basecontroller/privacy">Privacy</a></li>-->
</ul>
</div><!--/.nav-collapse -->
我已经部署了我的网站使用git到~/myaccount/domains/simon。然后我将public_html链接到~/myaccount/domains/simon.
lrwxrwxrwx 1 myaccount myaccount
30 Mar 28 17:35 public_html -> /home/myaccount/domains/simon
当我在wamp上本地尝试时,我已经在根目录下测试了以下.htaccess文件:
RewriteEngine on
RewriteCond $1 !^(index'.php|images|robots'.txt)
RewriteRule ^(.*)$ /projectname/index.php/$1 [L]
这似乎修复了目录结构,通过转动:
http://localhost/projectname/basecontroller/contact
为:
http://localhost/projectname/index.php/basecontroller/contact
然而,当我将它推送到生产服务器时,这似乎不起作用。我该如何解决这个问题?
我不知道,mod_rewrite是黑魔法。这是一个很好的工具,但是你永远不会得到一致的结果,特别是当从一个服务器到另一个服务器时。
你可以尝试随机玩的东西(例如:删除领先的/
或也许删除/projectname/
或也许尝试设置一个rewrite_base
)。
这是我们在一些服务器上使用的(但并不是在所有服务器上都有效):
首先,检查URL是否存在于文件系统中,并且什么都不做(images、css、robots.txt、index.php等):
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ - [L,QSA]
然后,如果失败,将所有请求发送到您的PHP文件(在检查当前URL是否已经转到该文件之后):
RewriteCond %{REQUEST_URI} !index.php$
RewriteRule ^(/?)(.*)$ $1index.php [L,QSA]
特别注意,我们检查可选的前导斜杠,并将其放在URL的开头,如果它在那里。你的代码不检查,然后总是放一个斜杠进去。这可能就是问题所在。
另外,您几乎总是希望在选项列表中有QSA。
Try This,
Options -Multiviews
RewriteEngine on
Rewritebase /projectname
RewriteCond $1 !^(index'.php|images|uploads|robots'.txt)
RewriteRule ^(.+)$ /index.php?$1 [L]
打开config.php然后尝试更改
$config['uri_protocol'] = 'AUTO';
到其中一个
| 'PATH_INFO' Uses the PATH_INFO
| 'QUERY_STRING' Uses the QUERY_STRING
| 'REQUEST_URI' Uses the REQUEST_URI
| 'ORIG_PATH_INFO' Uses the ORIG_PATH_INFO