【问题标题】:How to exclude a subdirectory from an Apache URL rewrite condition如何从 Apache URL 重写条件中排除子目录
【发布时间】:2014-02-18 14:39:55
【问题描述】:

我将以下重写条件应用于我的 Apache2 网络服务器的根目录(在 apache.conf 中)

<IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-l

    RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

    RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteCond %{SERVER_ADDR} !=127.0.0.1
    RewriteCond %{SERVER_ADDR} !=::1
    RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

    RewriteCond %{SCRIPT_FILENAME} -d [OR]
    RewriteCond %{SCRIPT_FILENAME} -f
    RewriteRule "(^|/)\." - [F]

</IfModule>

我有一个子目录www.domain.com/subdir,我不希望这些重写应用到它。如何从这些选项中排除 subdir

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    实际上,您只需要向上移动跳过文件/目录的最后一条规则。试试这个代码:

    Options +FollowSymlinks
    RewriteEngine On
    
    # if request is not for a file/directory 
    RewriteCond %{SCRIPT_FILENAME} -d [OR]
    RewriteCond %{SCRIPT_FILENAME} -f
    # then skip from rewrites
    RewriteRule ^ - [L]
    
    # add www to hostname
    RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteCond %{SERVER_ADDR} !=127.0.0.1
    RewriteCond %{SERVER_ADDR} !=::1
    RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    
    # forward all the requests to `/index.php
    RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
    

    【讨论】:

    • 谢谢,您能否解释一下您的更改的影响,以便我在实践中理解这是在做什么?
    • 当然让我添加一些 cmets 进行解释。
    • 现在查看答案,如果您有任何疑问,请告诉我。
    • 您写的 subdir 是一个子目录,如果是这种情况,那么第一条规则将从重写中跳过它,因为该规则具有以下条件:RewriteCond %{SCRIPT_FILENAME} -d 对于有效目录返回 true。跨度>
    • 你并不真正需要RewriteRule "(^|/)\." - [F],这就是为什么我省略了它,因为我们现在有非常强大的条件:RewriteCond %{REQUEST_FILENAME} !-f 它从重写中跳过所有有效文件(css/js/images 等) .
    【解决方案2】:

    就在这一行之后

    RewriteEngine On
    

    添加:

    RewriteRule ^/subdir/ - [L]
    

    RewriteCond %{THE_REQUEST} \ /+subdir/
    RewriteRule ^ - [L]
    

    【讨论】:

    • 谢谢,所以RewriteRule ^/subdir/ - [L] 排除了subdir 的所有重写条件?第二个选项(字面意思)提供了什么?
    • @alias51 是的,所以任何以/subdir/ 开头的请求都会通过重写引擎而无需任何修改。第二个选项是 影响浏览器发出的请求,因为当subdir/ 发生内部重写时,第一个选项也将被应用。不确定这对您的设置是否重要。
    猜你喜欢
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2021-02-11
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多