繁体   English   中英

Apache .htaccess RewriteRule

[英]Apache .htaccess RewriteRule

这是我的情况。 我有一个网络根目录和几个子目录,可以这样说:

/var/www
/var/www/site1
/var/www/site2

由于某些限制,我需要能够保留一个域并拥有这样的单独文件夹。 这对我来说很好用,但是两个站点中的许多JS和CSS引用都指向如下内容:

"/js/file.js"
"/css/file.css"

因为这些文件是绝对引用的,所以它们正在/ var / www中查找“ js”和“ css”目录,这些目录当然不存在。 有没有一种方法可以使用RewriteRules重定向对绝对引用文件的请求,使其指向正确的子目录? 我曾尝试做类似的事情:

RewriteEngine on
RewriteRule ^/$ /site1

要么

RewriteEngine on
RewriteRule ^/js/(.*)$ /site1/js/$1
RewriteRule ^/css/(.*)$ /site1/css/$1

但是这些都不起作用,甚至重定向到一个目录也没有,更不用说同时处理site1和site2了。 我正在尝试的可能吗?

编辑:解决方案

我最终适应了乔恩的建议以适应我的情况。 每当添加或删除新的子目录时,我都可以以编程方式对.htaccess文件进行更改。 对于我想要的每个“站点”,我的.htaccess中都有以下部分:

RewriteCond %{REQUEST_URI} !^/$
RewriteCond %{REQUEST_URI} !^/index.php$
RewriteCond %{HTTP_COOKIE} sitename=site1
RewriteCond %{REQUEST_URI} !^/site1/
RewriteRule ^(.*)$ /site1/$1 [L]

Index.php是一个文件,其中列出了我的所有站点,删除了“ sitename” cookie,并在选择了特定站点时将cookie设置为“ sitename = site#”。 我的RewriteConds检查

  1. 如果请求不是针对/
  2. 如果请求不是针对/index.php的
  3. 如果请求包含cookie“ sitename = site1”
  4. 如果请求不是以“ / site1 /”开头

如果满足所有这些条件,则将请求重写为在请求之前添加“ / site1 /”。 我尝试在第三个条件中使用一组匹配(\\ w +)而不是“ site1”的条件/规则,然后在第四个条件和规则中引用%1,但这不起作用。 我放弃了,为此解决了。

如果RewriteRules位于您的.htaccess文件中,则需要删除匹配中的前导斜杠(在将其发送到mod_rewrite之前,先将其删除)。 这样行吗?

RewriteEngine on
RewriteRule ^js/(.*)$ /site1/js/$1
RewriteRule ^css/(.*)$ /site1/css/$1

编辑:解决评论:

是的,可以,但是当我执行RewriteRule ^(.*)$ /site1/$1 ,它将导致Apache发出内部服务器错误。 但是在我看来,这应该只是各个规则的通用等效项!

该规则发生的事情是当/something/被重写为/site/something/ ,并且apache在内部进行重定向时,它再次被重写为/site/site/something/ ,然后再次被重写,等等。

您需要为此添加一个条件,例如:

RewriteCond %{REQUEST_URI} !^/site/
RewirteRule ^(.*)$ /site/$1 [L]

您需要设置符号链接 ,重写规则将使用它们,以便服务器级别的绝对链接可以跟随到中央站点托管帐户的符号链接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM