我有这个文件夹结构:
/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式,以及最终的决定是什么。
事后删除这些行,否则有一天,你会发现你没有像你应该那么多的磁盘空间…