.htaccess 在远程服务器上有效,但在本地主机上无效。在本地主机上出现 404 错误

.htaccess 在远程服务器上有效,但在本地主机上无效。在本地主机上出现 404 错误

我的问题:

当我访问 localhost 时,网站无法正常工作。它显示一些来自网站的文本,但似乎服务器无法找到任何其他文件。以下是来自 firebug 的错误片段:

"NetworkError: 404 Not Found - localhost/css/popup.css"
"NetworkError: 404 Not Found - localhost/css/style.css"
"NetworkError: 404 Not Found - localhost/css/player.css"
"NetworkError: 404 Not Found - localhost/css/ui-lightness/jquery-ui-1.8.11.custom.css"
"NetworkError: 404 Not Found - localhost/js/jquery.js"

看来我的服务器在错误的位置查找文件。例如,localhost/css/popup.css 实际上位于 localhost/app/webroot/css/popup.css。

我在远程服务器上设置了网站,配置完全相同,运行良好。我只是在尝试在 localhost 上的笔记本电脑上运行网站时遇到了这个问题。我编辑了 VirtualHosts 文件 DocumentRoot 并将其改为 /home/user/public_html/site.com/public/app/webroot/,这减少了一些错误,但我觉得这是错误的,有点像是黑客行为,因为我没有在可以正常工作的生产服务器上使用这些设置。

最后要说明的是,该网站使用动态 URL。我不知道这是否与此有关。例如,在生产服务器上,URL 为:site.com/#hello/12321。

以下是我的工作内容:

我的笔记本电脑上设置了一个 LAMP 服务器,运行在 Ubuntu 11.10 上。

我已经启用了 mod_rewrite:

sudo a2enmod rewrite

然后我编辑了我的虚拟主机文件:

<VirtualHost *:80>
  ServerName  localhost
  DirectoryIndex index.php
  DocumentRoot /home/user/public_html/site.com/public

    <Directory /home/user/public_html/site.com/public/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>
</VirtualHost>

然后我重新启动了 apache。我的网站使用的是 cakePHP。这是网站的目录结构:“/home/user/public_html/site.com/public”包含:

index.php app cake plugins vendors

这些是我的 .htaccess 文件:

/home/user/public_html/site.com/public/app/.htaccess:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^$    webroot/    [L]
    RewriteRule    (.*) webroot/$1    [L]
 </IfModule>

/home/user/public_html/site.com/public/app/webroot/.htaccess:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

答案1

您的 app/ 和 app/webroot 目录中有 .htaccess,但是根目录中没有任何内容。

您应该有以下文件:/home/user/public_html/site.com/public/.htaccess

RewriteRule    ^$    app/webroot/    [L]
RewriteRule    (.*) app/webroot/$1    [L]

或者

将您的 docroot 更改为

DocumentRoot /home/user/public_html/site.com/public/app/

这两个答案都假设 public/index.php 没有在 URI 上运行某种高级路由。但是嵌套的 .htaccess 文件进行重写会很麻烦。

答案2

您的站位位于/home/user/public_html/site.com/public

它包含了:index.php app cake plugins vendors

你的根.htaccess文件是:

RewriteRule    ^$    webroot/    [L]
RewriteRule    (.*) webroot/$1    [L]

所以这意味着:无论它是什么,转到webroot安装中的文件夹。

但我没看到任何 webroot文件夹。我是不是漏掉了什么?

答案3

我没有看到任何关于日志的提及。Firebug 不是 Apache 错误日志。在这种情况下,Apache 错误日志是无可替代的,因此启动错误日志并检查 error.log

http://httpd.apache.org/docs/2.2/logs.html#errorlog

答案4

在您的笔记本电脑上,您是否在 apache 配置中设置了 AllowOverride 以允许使用 .htaccess 文件?

看: http://httpd.apache.org/docs/2.2/mod/core.html#allowoverride

了解详情。

或者只需将以下内容添加到您的httpd.conf并重新启动 apache:

AllowOverride All

如果有帮助,请查看上述链接并优化AllowOverride指令。如果没有帮助,则删除AllowOverride您添加的(但保留任何已存在的其他内容)并重新启动 apache。

相关内容