htaccess बेसिक ऑथ से एक यूआरएल को बाहर करता है


79

मुझे सामान्य htaccess बुनियादी प्रामाणिक सुरक्षा से एक Url (या इससे भी बेहतर एक उपसर्ग) को बाहर करने की आवश्यकता है। कुछ ऐसा है /callbacks/myBankया /callbacks/.* क्या आपके पास कोई संकेत है कि यह कैसे करना है?

मैं जो नहीं देख रहा हूं वह यह है कि किसी फ़ाइल को कैसे बाहर रखा जाए। इसे url करना होगा (जैसा कि यह PHP फ्रेमवर्क पर आधारित समाधान है, और सभी यूआरएल को पुनर्निर्देशित किया mod_rewriteगया है index.php)। इसलिए इस URL के अंतर्गत कोई फ़ाइल नहीं है। कुछ भी तो नहीं।

उन यूआरएल में से कुछ अन्य सेवाओं से सिर्फ कॉलबैक हैं (कोई आईपी ज्ञात नहीं है इसलिए मैं आईपी पर आधारित नहीं कर सकता) और वे उपयोगकर्ता / पासवर्ड के लिए संकेत नहीं दे सकते।

वर्तमान परिभाषा के रूप में सरल है:

AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd
require valid-user 

जवाबों:


59

यदि आप Apache 2.4 का उपयोग कर रहे हैं, SetEnvIfऔर mod_rewrite वर्कअराउंड अब आवश्यक नहीं हैं क्योंकि Requireनिर्देश सीधे अभिव्यक्ति की व्याख्या करने में सक्षम है:

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#
Require valid-user

अपाचे 2.4 उन Requireनिर्देशों का व्यवहार करता है जो किसी समूह द्वारा नहीं होते हैं <RequireAll>जैसे कि वे एक में थे <RequireAny>, जो "या" कथन के रूप में व्यवहार करता है। यहाँ एक और अधिक जटिल उदाहरण है जो URI और क्वेरी स्ट्रिंग दोनों के मिलान के साथ प्रदर्शित होता है, और एक वैध उपयोगकर्ता की आवश्यकता होने पर वापस आता है:

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

<RequireAny>
    <RequireAll>
        # I'm using the alternate matching form here so I don't have
        # to escape the /'s in the URL.
        Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#

        # You can also match on the query string, which is more
        # convenient than SetEnvIf.
        #Require expr %{QUERY_STRING} = 'secret_var=42'
    </RequireAll>

    Require valid-user
</RequireAny>

यह उदाहरण एक्सेस की अनुमति देगा, /callbacks/foo?secret_var=42लेकिन इसके लिए उपयोगकर्ता नाम और पासवर्ड की आवश्यकता होगी /callbacks/foo

याद रखें कि जब तक आप उपयोग नहीं करते हैं <RequireAll>, अपाचे Require क्रम में प्रत्येक से मेल खाने का प्रयास करेगा, इसलिए सोचें कि आप किन परिस्थितियों में पहले अनुमति देना चाहते हैं।

Requireनिर्देश का संदर्भ यहां है: https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require

और exprनिबंध संदर्भ यहाँ है: https://httpd.apache.org/docs/2.4/expr.html


3
मुझे Apache 2.4.7 पर काम करने के लिए आवश्यकताएँ expr के आसपास दोहरे उद्धरणों को हटाना पड़ा। इसके अलावा पूरी तरह से काम किया।
स्कॉट स्मिथ

मुझे भी दोहरे उद्धरणों को हटाना पड़ा लेकिन इसने पूरी तरह से काम किया।
TMPilot

1
मेरे Apache 2.4.10 / cakephp 3 स्थापना पर काम नहीं करता है। मैं बाहर करना / आराम करना चाहता हूं, जो एक आभासी पथ है (नियम को फिर से लिखना)। यह पता नहीं चल सकता है कि यह काम क्यों नहीं कर रहा है।
स्टीफन रिक्टर

3
@ stephan-richter मुझे संदेह है क्योंकि %{REQUEST_URI}मूल्य फिर से लिखा स्ट्रिंग है। केक 3 के लिए, यह बहुत अधिक हमेशा समाप्त होता है /webroot/index.php। आपको मार्गों के प्रमाणीकरण को संभालने के लिए केक का उपयोग करके वैकल्पिक दृष्टिकोण के साथ आना पड़ सकता है।
१६:१६

तुम सही हो। इस मुद्दे पर एक प्रश्न पोस्ट किया और स्वयं उत्तर पाया: stackoverflow.com/questions/41077895/…
Stephan Richter

85

SetEnvIf का उपयोग करके , आप एक चर बना सकते हैं जब अनुरोध कुछ पथ से शुरू होता है, तो Satisfy Anyलॉगिन करने से बचने के लिए निर्देश का उपयोग करें ।

# set an environtment variable "noauth" if the request starts with "/callbacks/"
SetEnvIf Request_URI ^/callbacks/ noauth=1

# the auth block
AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd

# Here is where we allow/deny
Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=noauth

निर्देशों की अनुमति / अस्वीकार का हिस्सा कहता है कि हर व्यक्ति के लिए पहुंच से इनकार करते हैं , सिवाय इसके कि जब कोई वैध-उपयोगकर्ता (सफल बुनियादी लॉगिन) या यदि noauthचर सेट है।


मैंने <VirtualHost *: 80> DocumentRoot / var / www / Symfony / web / <Directory / var / www // Symfony / web> में यह खंड जोड़ा है, लेकिन इसका काम नहीं कर रहा है।
वि।

क्या आप कृपया बता सकते हैं कि, <Files> यहां काम क्यों नहीं करता है?
asdmin

1
धन्यवाद! वास्तव में मेरी मदद की, मामले से सावधान रहें - मेरे पास था Order deny,allowऔर यह काम नहीं करेगा। बहुत निराशा से कहने की जरूरत नहीं है!
जेम्स एफ

2
फिर से Allow from env=REDIRECT_noauthलिखने के लिए उरेल की आवश्यकता हो सकती है । @Vishal के साथ समस्या रही होगी। यहाँ एक नज़र है: [ stackoverflow.com/a/41092497/1285585]
स्टीफन रिक्टर

2
मैं की जरूरत है दोनों लाइनों Allow from env=noauthऔर Allow from env=REDIRECT_noauthयह काम करने के लिए।
CD31

6

यह समाधान बहुत अच्छी तरह से काम करता है, आपको बस उस श्वेतसूची को परिभाषित करने की आवश्यकता है जिसे आप पास करना चाहते हैं।

SetEnvIfNoCase Request_URI "^/status\.php" noauth

AuthType Basic
AuthName "Identify yourself"
AuthUserFile /path/to/.htpasswd
Require valid-user

Order Deny,Allow
Deny from all
Allow from env=noauth

Satisfy any

4

मैंने अन्य समाधानों की कोशिश की लेकिन यह मेरे लिए काम कर रहा है। उम्मीद है कि यह दूसरों की मदद के लिए होगा।

# Auth stuff
AuthName "Authorized personnel only."
AuthType Basic
AuthUserFile /path/to/your/htpasswd/file

SetEnvIf Request_URI "^/index.php/api/*" allow
Order allow,deny
Require valid-user
Allow from env=allow
Deny from env=!allow
Satisfy any

यह एपीआई यूआरएल और किसी भी यूआरएल स्ट्रिंग /index.php/api/को लॉगिन किए बिना खोलने की अनुमति देगा और कुछ और लॉगिन करने के लिए प्रेरित किया जाएगा।

उदाहरण:

mywebsite.com/index.php/apiबिना लॉगिन के mywebsite.com/index.php/api/soap/?wsdl=1बिना खोला जाएगा लॉगिन के लिए प्रेरित किए बिना खुल जाएगा लॉगिन करने के लिए प्रेरित किया mywebsite.comजाएगा


1
<location />
        SetEnvIf Request_URI "/callback/.*" REDIRECT_noauth=1

        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /etc/httpd/passwords/passwords
        Order Deny,Allow
        Satisfy any
        Deny from all
        Allow from env=REDIRECT_noauth
        Require user yournickname
</location>

0

एक अन्य दृष्टिकोण इस तरह से काम करता है, यदि आप जिस क्षेत्र की रक्षा कर रहे हैं, उसमें एक अखंड PHP स्क्रिप्ट है जो वर्डप्रेस की तरह सब कुछ नियंत्रित करती है। एक अलग निर्देशिका में प्रमाणीकरण सेट करें। वहाँ एक index.php रखो जो रास्ते पर एक कुकी सेट करता है '/'। फिर वर्डप्रेस (उदाहरण के लिए), कुकी की जांच करें, लेकिन चेक को बायपास करें अगर $ _SERVER ['REQUEST_URI'] बाहर रखा गया URL है।

मेरे साझा होस्टिंग प्लेटफ़ॉर्म पर, रेवेरिट्यूल एक पर्यावरण चर सेट नहीं कर सका जो "सैटिसफी एनी" के साथ काम करता है।

किसी भी दृष्टिकोण के साथ, यह देखें कि आप जिस पृष्ठ की सुरक्षा कर रहे हैं, उसमें चित्र, स्टाइलशीट आदि शामिल नहीं हैं, जब पृष्ठ ही नहीं है, तो प्रमाणीकरण अनुरोध को ट्रिगर करें।


0

अपनी रूट htaccess फ़ाइल के नीचे कोड जोड़ें और अपने व्यवस्थापक url, .htpasswd फ़ाइल पृष्ठ को बदलना न भूलें।

<Files "admin.php">
        AuthName "Cron auth"
        AuthUserFile E:\wamp\www\mg\.htpasswd
        AuthType basic
        Require valid-user
    </Files>

अपने रूट फ़ोल्डर में .htpasswd फ़ाइल बनाएं और नीचे उपयोगकर्ता नाम और पासवर्ड जोड़ें (डिफ़ॉल्ट उपयोगकर्ता नाम: व्यवस्थापक और पासवर्ड: admin123)

admin:$apr1$8.nTvE4f$UirPOK.PQqqfghwANLY47.

कृपया मुझे बताएं कि क्या आप अभी भी किसी मुद्दे का सामना कर रहे हैं।


0

आप जिस तरह से इरादा किया गया था, उसी तरह आप मूल आधार का उपयोग क्यों नहीं करते?

user:password@domain.com/callbacks/etc

1
खैर, क्योंकि ए) कोई भी वास्तव में यूआरआई स्ट्रिंग में ™ डेटा नहीं चाहता है, और बी) क्योंकि यह संभावना है कि ओपी को कॉल को अनुकूलित करने का अवसर नहीं है (क्योंकि वह बैंक से कॉलबैक के बारे में बात कर रहा है, मुझे लगता है कि वह बदलने में असमर्थ है। ग्राहक पक्ष पर व्यवहार)
frank42
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.