2009-07-05 10 views
14

का समर्थन करता है तो प्रोग्रामेटिक रूप से कैसे पता करें मैं क्या पूछना चाहता हूं कि यह पता लगाने का कोई तरीका है कि कोई वेब-सर्वर उदाहरण URL रीवाइटिंग सक्षम है या नहीं। मुझे सही प्रकार के यूआरएल हैंडलर को तुरंत चालू करने में सक्षम होने के लिए इसकी आवश्यकता है।यदि कोई वेब सर्वर इंस्टेंस यूआरएल रीरराइट

सैद्धांतिक रूप से आप पहले से जानते हैं अगर आपने इसे सक्षम किया है या नहीं और इसे कॉन्फ़िगर करने के लिए कुछ उपयोग कर सकते हैं। हालांकि, मैं रनटाइम पर स्वचालित रूप से इस सेटिंग का पता लगाने में सक्षम होना चाहता हूं।

^/(.*)$ => /bootstrap.php 

यह गारंटी देता है कि प्रासंगिक स्ट्रिंग REQUEST_URI में मौजूद है, लेकिन _GET सरणी को दूषित नहीं करता:

URL रीराइट नियम बहुत सरल की तरह कुछ होगा।

मेरे शोध किया मुझे अब तक ले गया:

  1. अपाचे।
    मेरी राय में अपाचे का एक बहुत ही विचित्र दृष्टिकोण है, क्योंकि यह यूआरएल को फिर से लिखने के लिए REDIRECT_SCRIPT_URI शीर्षलेख सेट करता है, लेकिन उन लोगों के लिए नहीं जो पुनर्लेखन नहीं कर रहे हैं।
    उदा।

    http://host/ana/are/mere
    को index.php पर फिर से लिखा जाएगा ताकि उपर्युक्त शीर्षलेख मौजूद होगा, लेकिन
    http://host/
    फिर से लिखा नहीं जाएगा।

  2. लाइटटैड।
    फास्ट-सीजीआई के साथ लाइटपैड ठीक व्यवहार करता है, यदि वर्तमान होस्ट के लिए यूआरएल रीवाइट सक्षम है तो REDIRECT_URI शीर्षलेख सेट करना। यह विश्वसनीय है।

  3. चेरोकी।
    ठीक है, चेरोकी के लिए मुझे कोई विधि नहीं मिली है, क्योंकि यह यूआरएल पुनर्लेखन प्राप्त करने के लिए एक और जटिल विधि का उपयोग करता है (मेरी राय में)। , (Ie, यह आंतरिक पुन: निर्देशित – कहा जाता है और fcgi प्रक्रिया पता नहीं है उस अनुरोध को रीडायरेक्ट किया गया था)

इसके अलावा, मैं परीक्षण नहीं किया अन्य http सर्वर, nginx के रूप में तो अगर किसी को इस पर कुछ इनपुट है मामला मुझे यह सुनना अच्छा लगेगा।

उत्तर

14

नहीं सबसे सुरुचिपूर्ण समाधान है, लेकिन आप, एक निर्देशिका बनाने एक .htaccess और एक छोटे से php फ़ाइल सम्मिलित करें और अपने वास्तविक कोड से कर्ल/file_get_contents() साथ इसे खोलने के लिए कोशिश कर सकते:

.htaccess

RewriteEngine on 
RewriteRule ^(.*?)$ index.php?myparam=$1 

index.php

<?php 
//open with file_get_contents("http://yoursite/directory/test") 
if($_GET['myparam']){die("active");} 
?> 

हालांकि यह एक स्थापना के दौरान स्वीकार्य हो सकता है, प्रदर्शन कारणों से इस प्रत्येक अनुरोध के लिए इस्तेमाल नहीं किया जाना चाहिए आपकी साइट पर! कहीं भी जानकारी सहेजें (sqlite/textfile)।

अद्यतन

अपाचे विशिष्ट है, लेकिन array_search के साथ संयोजन में apache_get_modules()/phpinfo()/strpos हो सकता है आप के लिए उपयोगी है।

6

PHP में अपाचे, आईआईएस और एनएसएपीआई सर्वर के लिए server-specific functions है।मैं केवल अपाचे है, लेकिन के रूप में merkuro सुझाव इस अपेक्षा के अनुरूप काम करता है: शायद सबसे अच्छा समाधान नहीं है पीएचपी सर्वर-विशिष्ट कार्यों सभी सर्वरों आप इस में परीक्षण करना चाहते हैं कवर नहीं करती हैं

<?php 
    if (in_array('mod_rewrite',@apache_get_modules())) 
    echo 'mod_rewrite enabled'; 
    else 
    echo 'mod_rewrite not enabled'; 
?> 

के रूप में।

मैं मेर्कुरो के पहले उत्तर की सिफारिश करता हूं - इसे लागू करने के बाद इसे स्क्रिप्ट में परीक्षण करना। मेरा मानना ​​है कि यह एक अच्छा परिणाम पाने का एकमात्र तरीका है।

आशा है कि मदद करता है!

+0

हाँ, जवाब के लिए धन्यवाद। मैं पूरी तरह से अपाचे विशिष्ट कार्यों के बारे में भूल गया। अपाचे के लिए –

+0

ग्रेट समाधान। मैं एक ही पंक्ति में सोच रहा था। –

9

यह पहले से ही नीचे पर भी चर्चा है, लेकिन मेरा मानना ​​है कि निम्नलिखित नुस्खा इस समस्या का एक नहीं बल्कि जलरोधक समाधान है:

  1. इसकी फिर से लिखा यूआरएल के माध्यम से एक पृष्ठ सेट करें पुनर्निर्देशन

  2. अनुरोध

  3. यदि अनुरोध पृष्ठ को प्रश्न में वापस लाता है, तो आपको HTTP 404 प्रतिक्रिया प्राप्त होने पर पुनर्निर्देशन सही तरीके से सेट किया गया है, तो यह काम नहीं कर रहा है।

विचार मूल रूप से यह है कि यह किसी भी पुनर्निर्देशन विधि के साथ काम करता है। इसका पहले ही उल्लेख किया जा चुका है, लेकिन भालू दोहराते हैं, इस तरह की चालें ओवरहेड का थोड़ा सा जोड़ती हैं और केवल एक बार बेहतर होती हैं (स्थापना या सेटिंग पैनल से) और फिर सेटिंग में सहेजी जाती हैं।


कुछ कार्यान्वयन विवरण, विकल्प बनाने के लिए और कैसे मैं इस समाधान के लिए आया था पर एक छोटे से:

मुझे याद Drupal स्थापना प्रक्रिया के दौरान इस तरह के एक चेक किया, तो मैं ऊपर देखा कि वे किस तरह किया था। उनके पास इंस्टॉल पेज पर जावास्क्रिप्ट था AJAX अनुरोध (समकालिक रूप से, डेटाबेस के साथ समवर्ती मुद्दों को रोकने के लिए)। इसके लिए उपयोगकर्ता को जावास्क्रिप्ट चालू करने के लिए सॉफ़्टवेयर इंस्टॉल करने की आवश्यकता होती है, लेकिन मुझे नहीं लगता कि यह एक अनुचित आवश्यकता है।

हालांकि, मुझे लगता है कि पृष्ठ का अनुरोध करने के लिए php का उपयोग क्लीनर समाधान हो सकता है। जावास्क्रिप्ट आवश्यकता के साथ परेशान न होने के साथ-साथ इसे आगे और पीछे भेजने के लिए भी कम डेटा की आवश्यकता होती है और केवल कई फाइलों पर कार्रवाई के तर्क की आवश्यकता नहीं होती है। मुझे नहीं पता कि किसी भी विधि के लिए अन्य (डी) लाभ हैं, लेकिन यह आपको जा रहा है और आपको वैकल्पिक विकल्पों का पता लगाने देता है।

एक और विकल्प बनना है: परीक्षण परीक्षण में या सामान्य साइट पर परीक्षण करना है या नहीं। ड्रूपल की चीज सिर्फ रीडायरेक्शन चालू होती है (जैसे कि अपाचे केस में, .htaccess फ़ाइल है जो रीडायरेक्ट करता है केवल ड्रूपल डाउनलोड का हिस्सा बनती है) लेकिन अगर रीडायरेक्शन चालू होता है तो केवल फैंसी यूआरएल लिखते हैं सेटिंग्स। इसका नुकसान यह है कि यह पता लगाने के लिए और अधिक काम होता है कि किस प्रकार के पुनर्निर्देशन का उपयोग किया जाता है, लेकिन यह अभी भी संभव है (उदाहरण के लिए आप एक जीईटी वैरिएबल जोड़ सकते हैं, फिर भी एक विशिष्ट परीक्षण पृष्ठ पर या यहां तक ​​कि प्रत्येक पृष्ठ पर रीडायरेक्शन इंजन दिखा रहा है, या आप $redirectionEngine सेट करने वाले पृष्ठ पर रीडायरेक्ट करें और फिर वास्तविक अनुक्रमणिका शामिल करें)। हालांकि मुझे अपाचे पर mod_rewrite के अलावा पुनर्निर्देशन के साथ अधिक अनुभव नहीं है, मुझे विश्वास है कि यह लगभग हर पुनर्निर्देशन इंजन के साथ काम करना चाहिए।

दूसरा विकल्प यहां एक परीक्षण वातावरण का उपयोग करना है। असल में विचार यह है कि या तो फ़ोल्डर बनाएं और इसके लिए पुनर्निर्देशन सेट करें, या फ़ाइल सिस्टम लिखने की आवश्यकता को हटा दें और इसके बजाय एक फ़ोल्डर (या प्रत्येक पुनर्निर्देशन इंजन के लिए एक फ़ोल्डर) को हटा दें।इसके कुछ नुकसान हैं: आपको अभी भी मुख्य साइट के लिए पुनर्निर्देशन सेट अप करने के लिए लेखन पहुंच की आवश्यकता है (हालांकि शायद सभी पुनर्निर्देशन इंजन के लिए नहीं, मैं वास्तव में नहीं जानता कि आप उन्हें कैसे ठीक से सेट करते हैं - लेकिन अपाचे के लिए आपको लेखन पहुंच की आवश्यकता होगी यदि आप पुनर्निर्देशन चालू करने जा रहे हैं), किसी भी सॉफ़्टवेयर का पता लगाने के लिए यह आसान हो सकता है कि आप किस सॉफ्टवेयर और परीक्षण का उपयोग करके इसका उपयोग कर रहे हैं (जब तक आप परीक्षण के बाद परीक्षण फ़ोल्डर्स को हटा नहीं देते) और आपको सक्षम होने की आवश्यकता है साइट के केवल एक हिस्से के लिए पुनः लिखें (जो कि किसी भी पुनर्निर्देशन इंजन की संभावना होने के लिए समझ में आता है, लेकिन मैं इस कार्यक्षमता को अंधाधुंध मानने वाला नहीं हूं)। हालांकि, यह पता लगाना आसान है कि कौन सा रीराइट इंजन इस्तेमाल किया जा रहा है या मूल रूप से पुनर्निर्देशन का कोई अन्य पहलू है। ऐसे अन्य फायदे भी हो सकते हैं जिन्हें मैं नहीं जानता, इसलिए मैं केवल विकल्प देता हूं और आपको अपनी विधि चुनने देता हूं।

उपयोगकर्ता के लिए कुछ विकल्प छोड़े गए हैं, मेरा मानना ​​है कि इससे आपको सिस्टम को इस तरह से स्थापित करने में मदद करनी चाहिए।

+0

अच्छा समाधान। यदि यह सही ढंग से कार्यान्वित किया गया था तो यह उस वेब सर्वर से स्वतंत्र होगा जिसका उपयोग किया जा रहा था। –

2

आप प्रोग्राम के रूप में mod_rewrite के होने की जाँच कर सकते हैं अगर सर्वर PHP में apache_get_modules() फ़ंक्शन का उपयोग करके अपाचे है:

$modules = apache_get_modules(); 
echo in_array('mod_rewrite', $modules) ? 'mod_rewrite detected' : 'mod_rewrite not detected'; 

यह पहला कदम के रूप में इस्तेमाल किया जा सकता है, लेकिन यह एक पूर्ण प्रमाण विधि नहीं है किसी भी तरह से। सिर्फ इसलिए कि mod_rewrite लोड किया गया है इसका मतलब यह नहीं है कि यह आपके पर्यावरण के लिए उपलब्ध है। अगर आप ऐसे सर्वर पर हैं जो अपाचे नहीं है तो यह भी मदद नहीं करता है।

ऐसी कई संगत विधियां नहीं हैं जो सभी प्लेटफार्म संयोजनों में काम करेगी। लेकिन चूंकि परिणाम सुसंगत है, इसलिए आप इसके लिए परीक्षण कर सकते हैं। एक विशेष रीडायरेक्ट सेटअप करें, और एक परीक्षण यूआरएल जांचने के लिए PHP की cURL या file_get_contents() का उपयोग करें। अगर रीडायरेक्ट सफल हुआ, तो आपको अपेक्षित सामग्री मिल जाएगी, और आप इसके लिए आसानी से परीक्षण कर सकते हैं।

यह एक बुनियादी .htaccess मैं ajax.php के लिए ajax रीडायरेक्ट करने के लिए सेटअप है:

RewriteEngine On 
RewriteRule ajax ajax.php [L] 

निम्नलिखित PHP स्क्रिप्ट ajax की सामग्री को प्राप्त करने के लिए प्रयास करेंगे। असली स्क्रिप्ट नाम ajax.php है। अगर रीडायरेक्ट विफल रहता है, तो उसे अपेक्षित सामग्री नहीं मिलेगी।

error_reporting(E_ALL | E_STRICT); 

$url = 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['REQUEST_URI']).'/ajax'; 
$result = json_decode(@file_get_contents($url)); 

echo ($result === "foobar") ? 'mod_rewrite test was successful' : 'mod_rewrite test failed'; 

आखिरकार, यहां स्क्रिप्ट का अंतिम भाग, AJAX.php है। यह एक उम्मीद प्रतिक्रिया लौटाता जब रीडायरेक्ट सफल हुआ:

echo json_encode('foobar'); 

मैं सेटअप एक live example of this test है, और मुझे भी उपलब्ध full sources बना दिया है।

+0

_apache_get_modules() यदि आप PHP का उपयोग CGI_ के रूप में कर रहे हैं तो काम नहीं करता है। –

1

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

बस अपनी .htaccess फाइल

RewriteEngine on 
RewriteRule ^/redir/My/Super/Special/Hidden/Url/To/Test/$ /redir/longload.php [L,R=307] 

में निम्नलिखित की तरह कुछ डाल दिया और फिर आप अगर mod_rewrite सक्षम किया गया है की जाँच करने के लिए निम्न php कोड का उपयोग कर सकते हैं।

<?php 
function HasModRewrite() { 
    $s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : ""; 
    $sp = strtolower($_SERVER["SERVER_PROTOCOL"]); 
    $protocol = substr($sp, 0, strpos($sp, "/")) . $s; 
    $port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]); 


    $options['http'] = array(
    'method' => "HEAD", 
    'follow_location' => 0, 
    'ignore_errors' => 1, 
    'timeout' => 0.2 
); 

    $context = stream_context_create($options); 

    $body = file_get_contents($protocol . "://" . $_SERVER['SERVER_NAME'] . $port .'/redir/My/Super/Special/Hidden/Url/To/Test/', NULL, $context); 
    if (!empty($http_response_header)) 
    { 
    return substr_count($http_response_header[0], ' 307')>0; 
    } 

    return false;  
} 


$st = microtime(); 
$x = HasModRewrite(); 
$t = microtime()-$st; 

echo 'Loaded in: '.$t.'<hr>'; 

var_dump($x); 
?> 

उत्पादन:

Loaded in: 0.002657 
--------------------- 
bool(true) 
+0

एक हेड अनुरोध भी करें। http://hakre.wordpress.com/2011/09/17/head-first-with-php-streams/, संबंधित प्रश्न लिंक, – hakre

+0

अपडेट किया गया। मुझे यकीन नहीं है कि एसएसकेएनएफ तेज/बेहतर है इसलिए मैंने इसे बदल नहीं दिया। –

संबंधित मुद्दे