AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 894798
Accepted
Nicolo
Nicolo
Asked: 2018-01-31 06:22:42 +0800 CST2018-01-31 06:22:42 +0800 CST 2018-01-31 06:22:42 +0800 CST

Htaccess Require expr Apache 2.4 适用于 osx-sierra 而不是 debian-jessie

  • 772

在我的开发机器 osx-sierra / apache 2.4.10(来自 brew)上,我在 VirtualHost 中有一个限制,允许在没有密码的情况下访问 /api/,所有其他页面都需要使用以下代码的密码:

<Location />
    AuthType Basic
    AuthName "Access"
    AuthUserFile /Users/xxxxxx/www/public/.htpasswd
    Require expr %{REQUEST_URI} =~ m#^/api/*#
    Require valid-user
</Location>

当我尝试使用相同的指令在我的生产服务器上执行此操作时,Debian-jessie / apache 2.4.29(来自 apt),它不起作用,总是询问密码(chrome/safari/wget),我尝试了这些解决方案:

1/

<Location />
    AuthType Basic
    AuthName "Access"
    AuthUserFile /home/xxxxxx/www/public/.htpasswd
    Require expr %{REQUEST_URI} =~ m#^/api/*#
    Require valid-user
</Location>

2/

<Location />
    AuthType Basic
    AuthName "Access"
    AuthUserFile /home/xxxxxx/www/public/.htpasswd
    Require expr %{REQUEST_URI} =~ m#^/api/.*#
    Require valid-user
</Location>

知道为什么会有这些差异吗?

谢谢

apache-2.4
  • 3 3 个回答
  • 1003 Views

3 个回答

  • Voted
  1. MrWhite
    2018-01-31T09:37:25+08:002018-01-31T09:37:25+08:00

    我不确定为什么这会在 osx-sierra / Apache 2.4.10 上工作,但在 Debian-jessie / Apache 2.4.29 上似乎不行。但是,作为一种解决方法,您可以使用容器上的负前瞻<LocationMatch>来执行此操作,而不是使用 Apache 2.4 表达式。例如:

    <LocationMatch "^(?!/api/.*$).*$">
        AuthType Basic
        AuthName "Access"
        AuthUserFile /Users/xxxxxx/www/public/.htpasswd
        Require valid-user
    </LocationMatch>
    

    现在,容器内的指令<LocationMatch>仅在 URL 未启动时处理/api/。(这也适用于 Apache 2.2)

    • 0
  2. Best Answer
    Nicolo
    2018-02-01T01:05:45+08:002018-02-01T01:05:45+08:00

    这是指令不起作用的完整虚拟主机:

    <VirtualHost *:80>
    DocumentRoot /home/xxxxxx/www/public
    ServerName xxxxxx.com
    
    Header set Access-Control-Allow-Origin "*"
    Header always set Access-Control-Allow-Methods "POST, PUT, GET, DELETE, OPTIONS"
    Header always set Access-Control-Allow-Headers "x-so-resource, x-so-apikey, x-so-apisecret, x-token, Authorization, Content-Type"
    
    <Directory /home/xxxxxx/www/public>
        php_value include_path "/home/xxxxxx/libs/ZendFramework-1.11.11/library"
        Options +FollowSymLinks 
        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
    </Directory>
    
    ServerSignature Off
    
    AddDefaultCharset UTF-8
    
    php_value short_open_tag 0
    
    SetEnv APPLICATION_ENV development
    
    
    <Location />
        RewriteEngine On     
        RewriteCond %{REQUEST_FILENAME} -s [OR]
        RewriteCond %{REQUEST_FILENAME} -l [OR]
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule ^.*$ - [NC,L]
        RewriteRule ^.*$ index.php [NC,L]
    </Location>
    
    
    <LocationMatch "^(?!/api/.*$).*$">
        AuthType Basic
        AuthName "Access"
        AuthUserFile /home/xxxxxx/www/public/.htpasswd
        Require valid-user
    </LocationMatch>
    
    ErrorLog /var/log/apache2/xxxxxxxx-error.log
    CustomLog /var/log/apache2/xxxxxxxx-access.log combined
    

    • 0
  3. ezra-s
    2018-02-01T04:14:39+08:002018-02-01T04:14:39+08:00

    为什么要这么复杂而不是直接做呢?

    <Location />
        AuthType Basic
        AuthName "Access"
        AuthUserFile /home/xxxxxx/www/public/.htpasswd
        Require valid-user
    </Location>
    
    <Location /api>
            Require all granted
    </Location>
    

    另请注意,您之前的 Directory(documentroot 目录)指令混合 2.2.x 和 2.4.x 指令可能会搞砸一切。

    一团糟:

    Order allow,deny
    Allow from all
    Require all granted
    

    正确的做法:

    Require all granted
    
    • 请务必删除 2.2。指令并卸载 mod_access_compat 以确保,您所做的是获得意外结果的秘诀。还要考虑您可能拥有的 .htaccess 文件可能会由于设置 AllowOverride all 而影响结果,理想情况下,如果您是站点的管理员,则不应使用该文件。
    • 0

相关问题

  • Apache2 - SSL 不工作

  • Apache <VirtualHost> 标签,如果客户端的 IP = x 则不重定向... 怎么做?

  • 我无法启用我的网站?[关闭]

  • SELinux 阻止 Apache 写入文件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve