HTACCESS 重写问题

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.comwww.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

当然,应该...将 替换为文件夹的其余名称。但这仍然需要您一次输入所有内容。可能有一种方法可以使用RewriteRules 和可能的子请求来自动化它,但我没有时间弄清楚它会是什么并对其进行测试。

答案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

这将逐行解释它尝试匹配什么正则表达式以及最终的决定是什么。

然后删除这些行,否则有一天你会发现你的磁盘空间并没有你想象的那么多……

相关内容