考虑到 .htaccess,获取在 XAMPP 和生产环境中工作的项目库 url

Get project base url that works in XAMPP and on production, considering .htaccess

我有一个项目 不在 XAMPP 文件夹的根目录中:

htdocs/my-folder/projects/my-project
htdocs/my-folder/projects/my-project/index.php
htdocs/my-folder/projects/my-project/js/
htdocs/my-folder/projects/my-project/css/

该文件夹包含一个 index.php 文件,我从中尝试调用样式表和脚本。最初,我只是这样做:

<script src="js/myscript.js"></script>

有效。但是,该项目已经扩展,现在用户可以 "save" 当前页面(类似于 JSFiddle 的做法),URL 看起来会有所不同。第一次保存时,将附加一个随机字符串作为 conf 参数,这会导致类似这样的结果(本地)并且应该有一个 public 等价物:

localhost/my-folder/projects/my-project?conf=abcd # locally
http://mywebsite.com/projects/my-project?conf=abcd # publicly

第二次保存时,URL 得到一个额外的参数,一个版本号:

localhost/my-folder/projects/my-project?conf=abcd&v=2 # locally
http://mywebsite.com/projects/my-project?conf=abcd&v=2 # publicly

但是,为了得到一个好的 URL 我使用这个 .htaccess:

Options +FollowSymLinks -MultiViews

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (\w+)[/](\d+)$ ?conf=&v= [L,NC]

这将导致如下结果:

localhost/my-folder/projects/my-project/abcd/2 # locally
http://mywebsite.com/projects/my-project/abcd/2 # publicly

问题是,当 URL 更改为上面的某些结构时(没有参数,但重写了 URLs,例如 localhost/my-folder/projects/my-project/abcd/2)然后初始调用我的索引文件中的资源(脚本、样式)将不再正确。

换句话说,如果这是url: localhost/my-folder/projects/my-project/abcd/2那么服务器会在localhost/my-folder/projects/my-project/abcd/2/js/myscript.js中寻找一个脚本文件,这显然是错误的。

因此,问题是:如何获得当前文件的绝对路径,但它在 XAMPP 中也有效(所以 __FILE____DIR__ 不会挖掘文件结构和 return file://) 以及生产环境。

您必须在网页中使用 base 元素。用法类似于:

<base href="/projects/my-project/" />

用于 public 服务器和

<base href="/my-folder/projects/my-project/" />

本地。

我偷偷弄明白了。通过检查 url 的末尾,我们确定我们是在根目录中还是在特定实例中(以数字结尾,例如 /1.

<?php
// Is connection secure? Do we need https or http?
// See 
$isSecure = false;
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
    $isSecure = true;
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) 
    && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'
    || !empty($_SERVER['HTTP_X_FORWARDED_SSL']) 
    && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') {
        $isSecure = true;
}

$REQUEST_PROTOCOL = $isSecure ? 'https' : 'http';
$REQUEST_PROTOCOL .= '://';

// Create path variable to the root of this project
$path_var = $REQUEST_PROTOCOL.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

// If URL ends in a slash followed by one or more digits (e.g. http://domain.com/abcde/1), 
// returns a cleaned version of the URL, e.g. http://domain.com/
if (preg_match("/\/\d+\/?$/", $path_var)) {
    $path_var = preg_replace("/\w+\/\d+\/?$/", '', $path_var);
}
?>

现在我们可以在 PHP 文件中使用它了!

<link href="<?php echo $path_var; ?>css/styles.css" rel="stylesheet">