【问题标题】:moving project to a subfolder messes my script path and url将项目移动到子文件夹会弄乱我的脚本路径和 url
【发布时间】:2016-01-20 14:28:43
【问题描述】:

我正在本地服务器的根文件夹中开发网站,问题是当我的客户告诉我将网站上传到他们的服务器时,它位于子文件夹中。所以url一直是这样的。 http://example.com/myproject

这种格式的问题是我所有的 css、js、ajax 调用都搞砸了,因为当我尝试检查 Firebug/chrome 控制台时,我看到了一个 http://example.com/assets/css/main.css ,实际上它应该是 http://example.com/myproject/assets/css/main.css

我所有的脚本都被编码成这样: <link rel="stylesheet" href="/assets/css/main.css"> 因为当项目不在子文件夹中时,它可以完美运行。

我现在的问题是,是否有一个技巧,可能在 .htaccess 或 mod_rewrite 中,可以让我告诉浏览器总是在我的所有脚本调用中添加 /myproject?

这样做的原因是我不想更改所有脚本调用并添加/myproject/...

这是我的 .htaccess 示例:

Options +FollowSymLinks

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    <Files .*>
        Order Deny,Allow
        Deny From All
    </Files>

    # Allow asset folders through
    RewriteRule ^(fuel/modules/(.+)?/assets/(.+)) - [L]

    # Protect application and system files from being viewed
    RewriteRule ^(fuel/install/.+|fuel/crons/.+|fuel/data_backup/.+|fuel/codeigniter/.+|fuel/modules/.+|fuel/application/.+) - [F,L]


    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule .* index.php/$0 [L]

    # Prevents access to dot files (.git, .htaccess) - security.
    RewriteCond %{SCRIPT_FILENAME} -d
    RewriteCond %{SCRIPT_FILENAME} -f
    RewriteRule "(^|/)\." - [F]

</IfModule>
Options -Indexes

您的帮助将不胜感激!谢谢!

【问题讨论】:

  • 您是否有权访问文档根目录中的 .htaccess 文件?
  • &lt;link rel="stylesheet" href="/assets/css/main,css"&gt;typo/comma 如果这是你的真实代码。
  • @w3d 不幸的是我没有。但我可以询问是否有解决方案。
  • 要回答这个问题,请查看php.net/manual/en/ini.core.php auto_append_file 和 auto_prepend_file - 可能是您正在寻找的。​​span>
  • @Fred-ii- 抱歉,我似乎无法想象使用那个。一直在谷歌上阅读它,但仍然无法掌握将其应用到我目前的情况。

标签: php .htaccess codeigniter mod-rewrite fuelcms


【解决方案1】:

如果您不能/不愿意编辑您的站点,那么您需要在站点的文档根目录中编辑 .htaccess 文件(或服务器配置)。将对不存在的文件的所有请求重写到项目的子目录:

例如:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/myproject%{REQUEST_URI} -f
RewriteRule !^myproject/ /myproject/$0 [L]

对于不在/myproject 子目录中的文件的所有请求,这些文件不存在,但确实存在于/myproject 子目录中,然后在内部将请求重写到/myproject 子目录。

这假设您的(子)站点由文件系统上存在的真实文件组成。

这将使您的项目看起来好像托管在文档根目录中。您可以从外部重定向 (R=301) - 但这会导致每个页面触发多个重定向,这是应该避免的!

但是,这是否有效取决于您的客户在其网站上托管的其他内容。

我认为最好的解决方案是编辑您的文件。

更新:由于您的站点有一个前端控制器(即,您正在通过index.php 路由所有对不存在文件的请求),因此上述指令将不会不太行。

但是,如果客户端只是托管一个由文件系统上的真实文件组成的站点,那么这可能会简化为:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !^myproject/ /myproject/$0 [L]

【讨论】:

  • 感谢您的回答!我会看看!我编辑了我的问题并添加了我的 .htaccess 的代码,可能会给你一个线索。再次感谢!
  • 啊,我从您现有的 .htaccess 文件中看到您有一个 前端控制器 - 您正在通过 index.php 路由所有请求。不幸的是,我上面的代码在这种情况下不起作用。它可以被修改(通过删除第三个RewriteCond 指令),但是,这意味着您的客户将难以在他们的网站上托管任何其他内容 - 尽管这可能会在一些例外情况下得到处理。您的客户还托管什么?
  • 他正在托管另一个自定义 PHP 站点,不是 CMS,不是 PHP 框架,只是一个基本的 PHP 站点。不确定这是否有帮助..
  • 如果他在另一个子目录中托管“其他自定义 PHP 站点”,那么为该其他子目录添加异常相对简单。但是,如果文档根目录和其他子目录中有很多文件,那就没那么简单了(除非有共同的模式)。
  • 另一个自定义 php 站点位于根文件夹中。所以文件分散在那里。然后是我的项目所在的另一个名为myproject 的文件夹。
【解决方案2】:

在基于 Unix 的文件系统(Web 路径所基于)中,路径开头的 / 是指向根级别的绝对路径。

对于网址,这意味着它直接进入您网站的文档根目录。

您需要从您的 href 属性中删除开头 /

<link rel="stylesheet" href="assets/css/main.css">

【讨论】:

  • 在基于 Windows 的系统中也是如此!
  • 这不是一个真正的答案,因此应该放在评论中
猜你喜欢
  • 2013-06-26
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多