HTACCESS重写问题

我有这个文件夹结构:

/var/www/mysite/abc/ /var/www/mysite/def/ /var/www/mysite/fgh/ /var/www/mysite/ijk/ /var/www/mysite/portal/ /var/www/mysite/wyz/ 

今天我的服务器将www.mydomain.com所有请求redirect到www.mydomain.com/portal ,这没关系…

但是我想修改这个行为,并保持www.mydomain.com在后台访问/var/www/mysite/portal/文件夹,而www.mydomain.com/abc/仍然访问/var/www/mysite/abc/文件夹像之前一样。

这就是我在我的htaccess上没有成功的尝试:

 IndexIgnore * Options +FollowSymlinks <IfModule mod_rewrite.c> RewriteEngine On #This doesn't work!!! #RewriteCond %{REQUEST_URI} !^abc #Neither this :\ #RewriteCond %{REQUEST_URI} !^/abc RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^$ /portal/index.php [L] RewriteRule . /portal/index.php [L] </IfModule> 

当我使用这个.htaccess(有或没有注释行)时,所有请求都会继续到www.mydomain.com/portal/

我会用

 Alias /abc /var/www/mysite/abc 

虽然这不在.htaccess文件中,但它需要放在VirtualHostconfiguration块中。

如果您无法访问虚拟主机configuration,请尝试

 RewriteRule ^/abc(.*) /var/www/mysite/abc$1 

但要确保它你现有的规则之前

编辑 :在回应你的意见,也许最简单的解决办法是做到这一点:

 DocumentRoot /var/www/mysite/ Alias / /var/www/mysite/portal/ 

但是,如果这是不可接受的,你可以做的一件事就是使用AliasMatch

 AliasMatch ^/(abc|def|fgh|...)(.*)$ /var/www/mysite/$1$2 

当然这里...应该被你的文件夹的其余名称replace。 但是,这仍然需要您input一次。 可能有一种方法使用RewriteRule和可能的子请求自动化,但我没有时间弄清楚它会是什么并testing它。

你可以尝试使用REQUEST_FILENAME条件 – 也就是说“如果REQUEST_FILENAME存在(并且是一个文件/目录/符号链接),不要重写它” – 类似的东西

 RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d [OR] RewriteCond %{REQUEST_FILENAME} -l RewriteRule ^.*$ - [L] 

这个重写规则的意思是“让请求经过不动”,并且[L]标志应该停止重写处理而不敲下面的门户重写。

除此之外,我build议使用RewriteLog和RewriteLogLevel(至less级别3)来获取有关条件为什么不正确匹配的更多信息。

尝试添加到您的httpconfiguration(在configuration中的某个地方,它不能在htaccess或虚拟主机级别)

 RewriteLog /tmp/rewrite.log RewriteLogLevel 9 

这将为你提供一个逐行的说明,试图匹配什么样的正则expression式,以及最终的决定是什么。

事后删除这些行,否则有一天,你会发现你没有像你应该那么多的磁盘空间…