1

将我在 localhost 中开发的站点与文件一起移动到我的托管服务器时,我总是遇到麻烦.htaccess。特别是文件的相对路径。修复并不难,但很麻烦。

例如:

  • 虽然ErrorDocument 404 /foo/404.php在托管中工作,但要在 localhost 中工作,我必须指定ErrorDocument 404 /projectroot/foo/404.php.

  • 使用时mod_rewriteRewriteRule ^example/$ example.php [L,NC] 可以在 localhost 中使用,但要使其在主机中使用,我必须使用 RewriteRule ^example/$ /example.php [L,NC](注意文件名前的斜杠)。

可能是因为我在 Windows 上运行 localhost 而我的主机在 Linux 上,但我认为这不是问题所在。

所以我的问题是,在本地或远程服务器上工作时,如何确保文件的路径正确?.htaccess 文件的“工作目录”是什么?

4

1 回答 1

7

这看起来可能比看起来稍微复杂一些,但我会通过以下方式解决您的问题。

  1. C:\Windows\System32\drivers\etc\hosts在指向 IP 127.0.0.1的文件上创建一个开发域,这是 localhost IP。

    例如,域名并不重要,只是您可以轻松地用于给定项目,test.dev因此主机文件如下所示:

    # localhost name resolution is handled within DNS itself.
    #   127.0.0.1       localhost
    #   ::1             localhost
    127.0.0.1   localhost
    127.0.0.1   test.dev
    127.0.0.1   www.test.dev
    
  2. 现在定义该项目的文件夹所在的位置,我将c:\projects\test在此示例中使用。

  3. 现在在您的 Web 服务器上virtualhost为您刚刚创建的域创建一个新的,这是我使用的一个示例virtualhost

    <VirtualHost *:80>
            ServerAdmin root@localhost
            DocumentRoot "C:/projects/test"
            ServerName test.dev
            ServerAlias www.test.dev
            ErrorLog "C:/projects/logs/test.dev_error_log"
            CustomLog "C:/projects/logs/test.dev_access_log" common
            RewriteLog "C:/projects/logs/test.dev_rewrite_log"
            RewriteLogLevel 9
            ScriptAlias /cgi-bin/ "C:/projects/test/cgi-bin/"
    
            <Directory "C:/projects/test">
                    Options -Indexes FollowSymLinks +ExecCGI
                    AllowOverride All
                    Order allow,deny
                    Allow from all
            </Directory>
            <Directory "C:/projects/test/cgi-bin">
                    AllowOverride None
                    Options None
                    Order allow,deny
                    Allow from all
            </Directory>
    </VirtualHost>
    
  4. 重新启动服务器以激活更改,您无需为 hosts 文件重新启动计算机,保存后它应该立即生效。

  5. 现在您可以使用http://www.test.devorhttp://test.dev并且您可以.htaccess在开发站点和实时站点上都使用相同的。


其他一些提示:

  1. 始终使用和定义RewriteBase /,因为它可以在您想要使用没有/开头的规则时特别有用,就像您提到的那样RewriteRule ^example/$ example.php [L,NC]

  2. 根据您要使用的规则,您可能需要指定-MultiViews,所以我经常默认保持打开状态,如下所示:

    Options +FollowSymLinks -MultiViews
    
  3. 正如您在我的virtualhost设置中看到的那样,我在默认情况下将访问、错误和重写日志定义到日志文件夹中,并使用有问题的域名,因此当我需要查看正在发生的事情时,我可以通过清晰的日志轻松访问只有那个域,而不是我在同一个域上运行的所有项目virualhost

我想就是这样,你真的不需要那么大virtualhost,这就是我使用它的方式,而且我不需要一直复制和粘贴它,因为我有自己的简单脚本来创建新域并完成所有为我工作。

于 2013-09-18T02:47:17.140 回答