我有一个看起来像的目录树:
public_html
_COMMON
INIT.php
project-1
index.php
project-2
index.php
这两个项目使用_COMMON中的文件。首先,他们通过index.php中的以下代码加载一些配置:
require_once '../_COMMON/INIT.php';
之后,他们通过以下方式使用公共资源:
<script src="../_COMMON/node_modules/jquery/dist/jquery.min.js"></script>
我有两个域名。它们都连接到同一台服务器,这意味着它们都提供相同的文件。我想从:
服务项目1http://example.com/project-1/
和
http://project1.com/
为此,我使用以下htaccess将project1.com
网址重写为project1.com/project-1/
:
RewriteCond %{HTTP_HOST} ^(?:www\.)?project1.com$
RewriteCond %{REQUEST_URI} !/project-1
RewriteRule ^(.*)$ /project-1/$1 [L,NC,QSA]
问题来了。
require_once
部分有效,因为在重写请求网址后,INIT.php
的网址已解析,这意味着:
http://project1.com/
http://project1.com/project-1/
http://project1.com/project-1/index.php
http://project1.com/project-1/index.php
已将../_COMMON/INIT.php
解析为http://project1.com/_COMMON/INIT.php
但是,脚本未成功加载。我想这是因为在重写URL之前,浏览器会解析jquery.min.js
的URL。我想以下情况会发生:
http://project1.com/
http://project1.com/project-1/index.php
,但网址为http://project1.com/
../_COMMON/node_modules...
并尝试解决它http://project1.com/_COMMON/node_modules/jquery/dist/jquery.min.js
http://project1.com/project-1/_COMMON/...
并且不存在 我可以添加一下:
RewriteCond %{REQUEST_URI} !/_COMMON
到我的htaccess并完成。
但是,这是一种俗气的解决方案。如果project-1使用根目录下另一个目录中的文件,该怎么办?在htaccess中添加所有这些目录似乎很愚蠢。如果网址不包含_COMMON
,我就不需要重写网址,如果它没有上传目录树,我需要重写网址,I.E。如果它包含../
。 有没有办法检测到它?
基本上,我想要的是不重写以../
开头的网址。我试过了:
RewriteCond %{REQUEST_URI} !\.\./
但它不起作用。我猜是因为../
已在浏览器中解析,因此它不在htaccess实际处理的网址内。 还有其他方法可以检测原始网址是否包含../
?