代码之家  ›  专栏  ›  技术社区  ›  dierre

拒绝使用.htaccess直接访问文件或目录

  •  4
  • dierre  · 技术社区  · 14 年前

    我在和你玩 .htaccess 我想知道,如果根目录中只有一个.htaccess,是否可以阻止所有来自浏览器的请求,这些请求指向现有的文件或目录。

    RewriteEngine On
    
    RewriteBase /~my_user/my_base/
    
    RewriteRule ^list/$ list.php [L]
    RewriteRule ^element_of_list/([a-zA-Z0-9\-]+)/$ element.php?elem_id=$1 [L]
    

    现在,如果我写 http://127.0.0.1/~my_user/my_base/list/ ,这很好,但如果我写 http://127.0.0.1/~my_user/my_base/list.php 它还在工作。我不想那样。我希望用户在最后一个例子中获得404错误。

    我们启用了/etc/apache2/mods/用户目录.conf

    <IfModule mod_userdir.c>
            UserDir public_html
            UserDir disabled root
    
            <Directory /home/*/public_html>
                    AllowOverride All
                    Options Indexes FollowSymLinks
                    <Limit GET POST OPTIONS>
                            Order allow,deny
                            Allow from all
                    </Limit>
                    <LimitExcept GET POST OPTIONS>
                            Order deny,allow
                            Deny from all
                    </LimitExcept>
            </Directory>
    </IfModule>
    

    我的第一次尝试是使用 RewriteCond :

    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^(.*)$ 404.php [L]
    

    但它不起作用。每个请求最终都会重定向到404.php

    更新

    所以我为目录创建了过滤器:

    RewriteCond %{REQUEST_FILENAME} -d
    RewriteCond %{REQUEST_URI} !^/~my_user/my_base/$ [NC]
    RewriteRule ^(.*)$ 404.php [L]
    

    它所做的是检查请求的路径( REQUEST_FILENAME 以及

    我仍在努力找到对文件有同样作用的东西。我知道我可以有选择地使用扩展名,但我想要一个 文件。

    2 回复  |  直到 14 年前
        1
  •  10
  •   Community Justin Hirsch    7 年前

    如果我正确理解了您的要求,您将希望执行以下操作:

    # This is a real directory...
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    # Or it's a real file...
    RewriteCond %{REQUEST_FILENAME} -d
    # And it's not 404.php...
    RewriteCond $0 !=404.php
    # And it's not the root
    RewriteCond $0 !=""
    # And it's not any of the above due to an internal redirect...
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    # So cause a 404 response (you could redirect to 404.php if you want)
    RewriteRule ^.*$ - [R=404,L]
    
    # Set the 404 error document
    ErrorDocument 404 /~my_user/my_base/404.php
    

    请记住,这个方块 因此任何图像、样式表或脚本也将被发送到404页。如果你只是想阻止对PHP文件的访问, Gumbo's solution RewriteCond 为了防止循环:

    # Make sure the reason this request has a .php is because it was requested
    # by the user (and not due to a redirect)
    RewriteCond %{THE_REQUEST} ^[A-Z]+\s/[^\s]+\.php
    # Make sure we aren't on 404.php already
    RewriteRule %{REQUEST_URI} !404\.php$
    # We aren't, so redirect to 404.php
    RewriteRule ^ 404.php [L]
    
        2
  •  2
  •   Gumbo    14 年前

    RewriteCond %{THE_REQUEST} ^[A-Z]+\ /[^?\ ]*\.php[/?\ ]
    RewriteRule .*\.php$ 404.php [L]
    

    这将重写其路径包含 .php