access denied


  • 背景: 想要使用nginx轉發 實現一個輸出PHPinfo的頁面, 比如: 訪問  aaa.com/phpinfo  瀏覽器顯示phpinfo的信息, 因為有的時候需要查看phpinfo, 所以想單獨配置一個能直接訪問phpinfo的頁面.  因為是PHP文件, 所以肯定需要轉發給PHP處理,  貼出配置
    location /phpinfo {
           proxy_pass  http://127.0.0.1:8867;
    }
    # nginx 轉發給8866 端口, 然后去配置一下8866 端口的服務
    server {
        lieten 8867;
        server_name quick.qun.me;   #外網能夠訪問的域名
        location / {
            alias  /home/php_project; #注意和root的區別 , 還要注意: alias和轉發PHP配置在一個location塊中的時候, 不會替換路徑
            index  index.php index.html index.htm;
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_index index.php;
            include fastcgi_params;     
        }
    }
    當我配置好了以后, 訪問quick.qun.me/phpinfo 的時候, 頁面顯示  access denied.   查看nginx error.log 出現*408132 FastCGI sent in stderr: "Access to the script '/home/php_project/phpinfo' has been denied (see security.limit_extensions)" while reading response header from upstream, client: 127.0.0.1, server: quick.qun.me, request: "GET /phpinfo HTTP/1.0", upstream: "fastcgi://127.0.0.1:9000", host: "127.0.0.1:8867"
  • 排查:  以為是nginx配置沒有開啟 autoindex  on  ;  但是一想不對, 如果是因為這個, 肯定是403 forbidden, 不會顯示access  denied. (根據我的判斷, 雖然access denied也是403, 但因為他是PHP處理的, 所以會顯示access denied)
    • 他有一個細節就是  security.limit_extensions , (網上說在php-fpm.conf文件里, 我沒找到,這個參數我是在/etc/php/7.0/fpm/pool.d/www.conf 文件里找到的)百度,  需要在這個后面加上 .php .php5 ..... 之類的, 我試了一下去掉注釋, 重啟php-fpm, 並沒有起作用. 還是access denied. (補充: 從5.3.9開始,php官方加入了一個配置"security.limit_extensions",默認狀態下只允許執行擴展名為".php"的文件,造成了其他類型的文件不支持的問題, 設置PHP允許的文件后綴名)  . 而且之前這個security.limit_extensions就是被注釋掉的, 項目也能訪問啊,  所以猜測肯定不是這個的原因.(其實后來想一想也是這個的原因,后面提到)
    • 但是nginx 的error.log 為什么偏偏提示這個信息呢? 隔了一天, 繼續研究一下, 再看nginx/error.log, 突然想到路徑的問題,  (ps: 之前沒有考慮路徑是因為覺得alias 配置的路徑沒問題)  去看 了一下, 提示 "Access  to the  script   '/home/php_project/phpinfo'   has  been  denied",  如果是路徑的問題, 那么應該是報文件或路徑不存在之類的, 就說明還是和PHP有關的, 按照alias 的規則, 應該是把/phpinfo 替換掉了才對. 但是這里並沒有替換掉, 我曾一度懷疑是alias 規則沒搞明白, 后來經過測試,  也想明白了, 之所以alias沒有起作用,  是因為轉發給了PHP 處理,  如果注釋掉fastcgi那幾個配置,  就會發現, alias替換掉了/phpinfo,  而交給PHP處理, alias是不會替換的. 
    • 解決辦法:  修改location /  為 location  /phpinfo , 然后還是不行, error.log報錯Unable to open primary script: /home/php_project/phpinfo/index.php (No such file or directory)" , 再創建一個phpinfo目錄, 在目錄下創建index.php 文件, 訪問/phpinfo 還是access denied, 但是訪問/phpinfo/  或者 /phpinfo/index.php 就OK了. (訪問的時候, 路徑phpinfo后面記得加一個/ ,不然PHP程序會把phpinfo當做文件來處理)
    • 不過這里有一點需要注意:  (參考alias替換URI規則)   注意  alias 所在location 並不是/phpinfo, 轉發之前是/phpinfo, alias實際替換的是 / , 因為alias所在的location是 / , 我誤認為是alias 所在的location是 /phpinfo了, 所以沒有發現問題. 所以問題出在了location的配置上. 加一個phpinfo就OK了.
    • 繼續說:   如果location / {} 里沒有配置fastcgi, 那么應該就會報404或者403或者下載(沒有測試, 只是猜測)  但是現在配置了fastcgi , 所以說 就會把這個請求交給PHP處理, 而PHP發現phpinfo不是  .php 后綴, 所以返回access denied. (那么現在也就知道了access denied 就是PHP處理程序返回的信息,和nginx無關) . 到這里, 處理方法有兩種, 一種是修改security.limit_extensions, 如果phpinfo是文件的話, 可以修改此參數, 但現在phpinfo是目錄, 所以不修改此參數, 而是從alias入手. 修改location / 為 location /phpinfo   就OK了.
  • 解決方法: 修改location /  為 location  /phpinfo , 然后還是不行, error.log報錯Unable to open primary script: /home/php_project/phpinfo/index.php (No such file or directory)" , 再創建一個phpinfo目錄, 在目錄下創建index.php 文件, 訪問/phpinfo 還是access denied, 但是訪問/phpinfo/  或者 /phpinfo/index.php 就OK了
  • 總結:  (1)access denied 基本上就是請求的URI轉發給PHP處理, 但是文件后綴不是.php  或者需要在security.limit_extensions 里添加后綴.   
    (2) 還有在轉發的時候, 如果用到了alias, 需要注意, alias 替換的 URI 不要弄混, 一定是替換的alias所在的location .  而不是proxy_pass 所在的location塊.
    (3) alias 所在的location塊中遇到配置fastcgi的時候, 就不會替換路徑(root不知道, 至少alias是這樣的), 只有在nginx本身處理的時候, alias才會替換掉location匹配的URI, 如果交給PHP處理,  則不會替換location匹配到的URI, 而是將完整的路徑直接給PHP處理.
    (4) PHP處理的時候, 會判斷路徑最后面有沒有/ , 有/ PHP認為是目錄, 會在這個目錄下找PHP文件, 如果是/phpinfo 這種最后沒有/, PHP就會把phpinfo當成是文件, 就會出現access denied,  PHP不認識phpinfo文件, 提示你修改security.limit_extensions. (所以上面訪問/phpinfo還是access denied)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM