我有一个 codeigniter 网站,该网站的链接结构已损坏。它在我的 wamp 本地环境中工作正常。但是,当我部署到共享托管站点时,链接停止工作。初始页面加载正常。我的导航栏看起来像:
<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,并且不执行任何操作(图像、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。
关于php - 为什么我的 .htaccess 在部署时停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22726470/