我有这个文件夹结构:
/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
到www.mydomain.com/portal
,没问题......
但我想修改这种行为并继续在后台www.mydomain.com
访问该文件夹,同时仍然像以前一样访问该文件夹。/var/www/mysite/portal/
www.mydomain.com/abc/
/var/www/mysite/abc/
这就是我尝试过但没有成功的方法访问控制:
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/
(无论是否带有注释行)
答案1
我会用
Alias /abc /var/www/mysite/abc
尽管它不会进入 .htaccess 文件,但它需要放入VirtualHost
配置块中。
如果您无权访问虚拟主机配置,请尝试
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
当然,应该...
将 替换为文件夹的其余名称。但这仍然需要您一次输入所有内容。可能有一种方法可以使用RewriteRule
s 和可能的子请求来自动化它,但我没有时间弄清楚它会是什么并对其进行测试。
答案2
您可以尝试反过来使用 REQUEST_FILENAME 条件 - 例如说“如果 REQUEST_FILENAME 存在(并且是文件/目录/符号链接),请不要重写它” - 类似于
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^.*$ - [L]
该重写规则意味着“让请求不受影响地通过”,并且 [L] 标志应该停止重写处理,而不会影响下面的门户重写。
除此之外,我建议使用 RewriteLog 和 RewriteLogLevel(至少级别 3)来获取有关条件不正确匹配的原因的更多信息。
答案3
尝试将其添加到您的 http 配置中(在配置中的某处,它在 htaccess 或虚拟主机级别不起作用)
RewriteLog /tmp/rewrite.log
RewriteLogLevel 9
这将逐行解释它尝试匹配什么正则表达式以及最终的决定是什么。
然后删除这些行,否则有一天你会发现你的磁盘空间并没有你想象的那么多……