-F参数不能像我在.htaccess

时间:2017-08-09 06:59:46

标签: apache .htaccess mod-rewrite

我正在研究我的.htaccess,显然我遇到了一些麻烦...... 我已经阅读了大量的文章和文档,我仍然无法弄清楚问题是什么:

  • 我正在尝试将用户重定向到其他公用文件夹,如果用户正在访问子域

  • 如果用户正在访问顶级域名,则应将其重定向到主公用文件夹

  • 如果文件夹中不存在文件,则将用户重定向到index.php

这就是我提出的:

RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com$ [NC]
RewriteCond __/%2/public/$1 -F
    RewriteRule ^(.*)$ __/%2/public/$1 [QSA,L]

RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteCond public/$1 -F
    RewriteRule ^(.*)$ public/$1 [QSA,L]

RewriteCond __/%2/public/$1 !-F
RewriteCond public/$1 !-F
    RewriteRule ^(.*)$ index.php?request=/$1 [QSA,L]

可悲的是,它并没有真正起作用......好吧,除非我注释掉最后一个RewriteRule

有什么建议吗?我做错了什么?

1 个答案:

答案 0 :(得分:1)

  1. 一个问题是,您的第一个条件的正则表达式也会匹配www.example.com,这是主域而不是子域。
  2. -f需要完整路径而非相对路径,因此请在路径前添加%{DOCUMENT_ROOT}/
  3. 使用-f代替-F
  4. 最后一条规则没有%2
  5. 的反向引用

    您可以在站点根目录中使用以下代码.htaccess:

    RewriteEngine On
    
    RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
    RewriteCond %{DOCUMENT_ROOT}/public/$1 -f
    RewriteRule ^(.*)$ public/$1 [L]
    
    RewriteCond %{HTTP_HOST} ^(?:www\.)?((?!www\.)[a-z0-9-]+)\.example\.com$ [NC]
    RewriteCond %{DOCUMENT_ROOT}/__/%1/public/$1 -f
    RewriteRule ^(.*)$ __/%1/public/$1 [L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?request=/$1 [L,QSA]