【问题标题】:Why does .htaccess redirect URL routing fine but break css/js/image links after two levels deep?为什么 .htaccess 重定向 URL 路由很好,但在两级深度后会破坏 css/js/image 链接?
【发布时间】:2013-06-08 10:21:46
【问题描述】:

我在站点的子目录中有以下 .htaccess 文件:

RewriteEngine On

RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?params=$1 [L,QSA]

我有以下 index.php 文件:

<html>
    <head>
        <link href="css/main.css" rel="stylesheet"/>
        <script src="http://code.jquery.com/jquery-latest.js"></script>
        <script src="js/main.js"></script>
    </head>
    <body>
        <p>if css loads, this should be green</p>
        <p id="message">javascript is NOT loaded</p>
        <div>If images are displaying correctly, then there should be a green square below:</div>
        <img src="images/test.jpg"/>
        <div style="margin: 10px 0 0 0;font-weight: bold;background-color:#eee"><?php echo '$_SERVER["REQUEST_URI"] = '. $_SERVER["REQUEST_URI"]; ?></div>
    </body>
</html>

所有 URL 都正确重定向到 index.php。但是,如果 URL 比子目录路径深一层以上,那么我的 css/js/images 路径就会损坏:

我必须对 .htaccess 文件进行哪些更改,以使路由在任何级别都能正常工作并且不会破坏我的 css/js/image 路径?

【问题讨论】:

  • 您始终可以提供文件的绝对 URL。如果您在 PHP 中为站点 url 设置一个变量并在每个包含的前面回显该变量,则更容易维护。
  • 我已经考虑过了,但如果可能的话,我想保持这些链接的相对性,只是为了降低将站点从服务器移动到服务器、从本地移动到在线等的开销。
  • 试过'base'标签?
  • 我在 htaccess 方面不是最擅长的,但我使用过很多 CMS,他们都使用绝对 URL 来完成。我会喜欢这个问题,也许有人能想到一个聪明的解决方案。

标签: php .htaccess routing


【解决方案1】:

根据绝对 URL 建议,如果文件始终位于域的根目录,并且您可以控制 html,则可以使用前导斜杠绝对,这可能避免在服务器之间编辑它们.

/css/main.css
/js/main.js
/images/test.jpg

如果文件移动,或者您无法控制 html,htaccess 规则会有所帮助。例如,我在一些使用 Dreamweaver 的项目中工作,它喜欢做 ../images/test.jpg。

RewriteRule (css|js|images)/(.+)$ /$1/$2 [NC,QSA,L]

这假定文件实际上位于域的根目录。如果这在服务器之间有所不同,那么您需要在 htaccess 中编辑路径 - 但这仍然比编辑 html 更容易。

这里假设所有的样式、脚本和图片都在css、js、images这三个文件夹中;这些是唯一具有这些名称的文件夹。例如,其他子文件夹中不能有其他图像文件夹。

这将破坏以这些字符串结尾的任何文件夹,例如 myimages 或 somecss。这可以通过调整规则以要求它们独立来避免。那么那些文件夹就不会被改变,只会改变特定的css、js和images文件夹。

RewriteRule (?:^|/)(css|js|images)/(.+)$ /$1/$2 [NC,QSA,L]

(?:^|/) 表示不捕获?:,在开头^ 或斜线后/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    相关资源
    最近更新 更多