【问题标题】:mod_rewrite VS relative pathsmod_rewrite VS 相对路径
【发布时间】:2011-06-13 17:20:21
【问题描述】:

我的 mod_rewrite 代码是:

Options +FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)?$ index.php?url=$1 [L,NC]

这个结构放在我的服务器路径/beta

当我放置 URL http://mydomain.com/beta/download 时,一切正常,重写为真实路径 http://mydomain.com/beta/index.php?url=download

问题发生在相对路径上。当我输入 URL http://mydomain.com/beta/download/box 时,重写会转到 http://mydomain.com/beta/index.php?url=download/box... 但是....

我所有的相对路径,比如我的 css 文件夹、我的 js 文件夹、图像文件......我的 index.php 页面中具有相对路径的所有内容都崩溃了,因为我的相对路径变为 download/cssdownload/js、@987654330 @...等等...

我知道这个问题是由于路径“download/”中的斜线而发生的,但是如何使用 .htaccess 中的 mod_rewrite 解决这个问题?

我可以防止在相对路径中重写吗?甚至在我自己域的内部路径中?

如何在不将相对路径更改为绝对路径的情况下解决这个问题?

谢谢

【问题讨论】:

  • 在你的 HTML 头部添加一个 yoururl.com/beta" /> 标签。如果您在该子文件夹中,还要将 RewriteBase /beta/ 添加到 htaccess。
  • 我可以知道您用来访问 js 和 css 文件的相对 URI 是什么吗?
  • @PENDO 很棒的解决方案我的朋友!!!!这正是我想要的!简单高效。谢谢!!!

标签: php apache mod-rewrite


【解决方案1】:

<base href="yoururl.com/beta/"; /> 标签添加到您的 HTML 头部。如果您在该子文件夹中,还要将 RewriteBase /beta/ 添加到 htaccess

【讨论】:

  • 谢谢,这有很大帮助。 :) :)
  • 并确保将其添加到 HTML 头标记之后,而不是 CSS 和 js 路径之后。
【解决方案2】:

在使用 mod_rewrite 时,您应该始终对图像 css 等使用绝对路径,但简单的解决方案可能是忽略 css、js、图像并在 RewriteRule ^(.+)?$ index.php?url=$1 [L,NC] 中休息

RewriteRule ((js|css|images)\/.*)$ /$1 [L,NC]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)?$ index.php?url=$1 [L,NC]

但是,如果这些目录实际上依赖于当前 url,这可能不起作用

【讨论】:

    【解决方案3】:

    我已经测试了标签,不需要指明 http:// 以下代码对我有用:

    <base href="<?php echo dirname($_SERVER['PHP_SELF']);?>/" />
    

    【讨论】:

      【解决方案4】:

      服务器永远不会知道请求是通过相对路径还是绝对路径来的,因此您无能为力。如另一个答案所述,您可以例外,但维护所有例外等将在某个时候成为 PITA。 ;)

      我总是使用绝对路径,尤其是在重写时,所以我建议这样做,这是最简单的方法

      【讨论】:

        【解决方案5】:

        添加行:

        <BASE href="http://www.sitename.com/">
        

        &lt;head&gt; 标签内的我的页面对我来说非常有用。它甚至可以编写一个 PHP 函数来实现自动化,这样您就不必在其他场合费心复制/粘贴了。

        更新:

        <?php
        $BaseDir = 'http://'.$_SERVER['SERVER_NAME'].substr($_SERVER["SCRIPT_NAME"], 0, strrpos($_SERVER["SCRIPT_NAME"],"/")+1);
        ?>
        
        <head>
        ...
        <BASE href="<?php echo $BaseDir; ?>">
        ...
        </head>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-15
          • 2012-02-24
          • 2016-04-11
          • 2014-01-07
          • 2023-03-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多