Bir web sunucusu örneği url rewrite destekliyorsa eğer programlı bulmak için nasıl

5 Cevap php

Bir web sunucusu örnek URL Yeniden Yazma etkin olup olmadığını öğrenmek için bir yol olup olmadığını ne sormak istiyorum. Ben URL işleyicisi doğru türü örneğini edebilmek için bu gerekiyor.

Eğer etkin veya değil ve yapılandırmak için bir şey kullanabilirsiniz varsa, teorik olarak önceden biliyorsunuz. Ben zamanında bu ayarı otomatik olarak tespit edebilmek için, ancak, istiyorum.

URL yeniden yazma kuralı gibi çok basit bir şey olurdu:

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

Bu, ilgili dize REQUEST_URI mevcut olduğunu garanti eder, ama _GET dizi kirletmez.

Nerede benim araştırma şimdiye kadar götürdü etmedi:

  1. Apache.
    In my opinion Apache has a very quirky approach, since it sets the REDIRECT_SCRIPT_URI header for rewrote URLs, but not for the ones that are not rewrote.
    E.g.

    http://host/ana/are/mere
    would be re-wrote to index.php so the aforementioned header would be present, but
    http://host/
    wouldn't be re-wrote.

  2. Lighttpd.
    Lighttpd with fast-cgi behaves OK, setting the REDIRECT_URI header if URL Rewrite is enabled for the current host. This is reliable.

  3. Cherokee.
    Well, for Cherokee there is no method that I found out, as it uses (in my opinion) a more complicated method for obtaining URL rewriting. (I.e., it's called internal redirect – and the fcgi process doesn't know that the request was redirected)

Ayrıca ben nginx gibi, diğer http sunucuları test değil, bu yüzden birisi bu konuda bazı girişi varsa bunu duymak isterim.

5 Cevap

Değil en zarif çözüm, ancak, bir dizin oluşturmak htaccess ve küçük bir php dosyası eklemek ve gerçek kodu / file_get_contents() kıvrılma ile açmayı deneyebilirsiniz.:

. 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");}
?>

Bu yükleme sırasında kabul edilebilir olsa da, performans nedenleriyle bu sitenizde her istek için kullanılmamalıdır! Bilgileri bir yerde (sqlite / Textfile) kaydedin.

Update

Özel, fakat apache_get_modules() /phpinfo() array_search / strpos ile kombinasyon halinde Apache size belki de yararlıdır.

Zaten aşağıda değinirken, ama ben aşağıdaki tarifi bu soruna oldukça su geçirmez çözüm olduğuna inanıyoruz ediyor:

  1. Yönlendirmeyi kurmak

  2. Onun yeniden yazılmış url üzerinden bir sayfa için istekte

  3. Istek söz konusu sayfayı dönerse, HTTP 404 yanıt alırsanız, o zaman işe yaramıyor, doğru kurulmuş yönlendirmeyi var.

Fikir bu sadece ilgili herhangi bir yönlendirme yöntemi ile çalışır temelde. Zaten söz edilmiştir, ama yineledi ayılar, bu tür hileler havai yeraldığını eklemek ve daha iyi sadece bir kez (kurulum veya ayar panelinden) ve daha sonra ayarları kaydedilir yapılmaktadır.


Bazı uygulama detayları, yapmak seçimler ve ben bu çözüm nasıl geldi biraz:

Ben Drupal yükleme işlemi sırasında bu tür bir kontrol yaptım hatırladı, bu yüzden ben bunu yaptım nasıl baktı. Onlar yüklemek sayfada javascript vardı bir ajax isteği (eşzamanlı, veritabanı eşzamanlılık sorunları önlemek için) yapmak. Bu javascript açık olması yazılım yüklemeden gerektirir, ama bu mantıksız bir gereklilik olduğunu sanmıyorum.

Ancak, ben sayfasını istemek için php kullanarak daha temiz bir çözüm olabilir sizce. Bir javascript şartı ile rahatsız değil yanı sıra, aynı zamanda geri ve ileri gönderilecek ve sadece birden fazla dosya yayılmış edilecek eylem mantığı gerektirmeyen daha az veri gerekiyor. Diğer (dis) avantaj ya yöntemi için varsa ben bilmiyorum, ama bu gidiş almak ve alternatif seçenekler kendiniz keşfetmek izin vermelisiniz.

Bir test ortamında veya normal bir sitede test edip: yapılacak bir seçim var. Drupal yaptığı şey sadece yönlendirme her zaman açık olması olduğunu (örneğin apache olduğu gibi, sadece Drupal indirip bir parçası olmak yönlendirir yapar. Htaccess dosyası var) ama yönlendirme de açıksa sadece fantezi adresler yazmak ayarlar. Bu kullanılan hangi tip yönlendirmenin algılamak için daha fazla iş alır dezavantajı vardır, ama örneğin belirli bir test sayfası hatta her sayfada ya yönlendirme motoru gösteren bir GET değişkeni ekleyebilirsiniz (hala mümkün, ya da yapabilirsiniz ) ayarlar $redirectionEngine ve ardından gerçek indeks içeren bir sayfaya yönlendirir. Ben apache üzerinde mod_rewrite ile başka yönlendirmesi ile fazla deneyimim yok ama, ben bu hemen her yönlendirme motoru ile çalışmak gerektiğine inanıyoruz.

Burada Diğer seçenek bir test ortamı kullanmaktır. Temelde fikir bir klasör oluşturun ve bunun için yönlendirme kurmak, veya dosya sistemi yazma erişimi için ihtiyaç kaldırmak ve bunun yerine (her yönlendirme motor veya bir klasörü) bir klasör var ya değildir. Bu, bazı dezavantajları vardır: hala belki tüm yönlendirmelerden motor için, ben gerçekten tüm bunları düzgün kurmak nasıl bilmiyorum olsa (ana site için yönlendirmeyi ayarlamak için yazma erişimi gerekir - ama apache için yazma erişimi gerekir siz) yönlendirme açmak için gidiyoruz eğer, testten sonra deney klasörleri kaldırmak sürece size (testler erişen aracılığıyla kullanarak hangi yazılım ve bunun hangi sürümünü tespit etmek için bir bot için daha kolay olabilir) ve size gerekiyor Sitenin sadece bir kısmı için yeniden (bir olasılık olması için herhangi bir yönlendirme motoru için mantıklı, ama körü körüne bu işlevi üstlenmeye gitmiyorum). Ancak, bu yeniden yazma motorunun kullanıldığı ya da temelde yönlendirme başka yönü olarak hangi öğrenmek için kolay olmanın avantajı ile geliyor. Orada da ben bilmiyorum diğer avantajları olabilir, bu yüzden sadece seçenekler vermek ve sizin yöntemi kendiniz izin verebilirim.

Kullanıcıya kalan bazı seçenekleri ile, bu sizin gibi bir şekilde sistem kurmak yardım etmesi gerektiğine inanıyorum.

PHP server-specific functions Apache, IIS ve NSAPI sunucular için vardır. Ben sadece Apache var ama merkuro önerdi beklendiği gibi bu işleri:

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

PHP sunucu-özel fonksiyonlar bu test için istediğiniz tüm sunucularını örtmeyen muhtemelen en iyi çözüm değildir.

Ben merkuro ilk cevabı öneririm - Senaryoda test sonra uygulanması. Ben iyi bir sonuç almak için tek yol olduğuna inanıyorum.

Umarım ki olur!

Programlı, sunucu PHP apache_get_modules() fonksiyonunu kullanarak Apache ise mod_rewrite varlığı için kontrol edebilirsiniz:

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

Bu ilk adım olarak kullanılabilir, ama hiçbir şekilde tam bir kanıtı yöntem değildir. Mod_rewrite yüklü sırf bu ortamı için geçerli olduğu anlamına gelmez. Apache olmayan bir sunucu üzerinde bulunmaktadır, bu da yardımcı olmuyor.

Tüm platform kombinasyonlarında genelinde çalışacak çok tutarlı yöntemler yok. Sonuç tutarlı olduğu, ancak, bunun için test edebilirsiniz. Kur, özel bir yönlendirme ve bir komut dosyası bir test URL'yi kontrol etmek PHP'nin cURL veya file_get_contents() kullanmak zorunda. Yönlendirme başarılı olursa, size beklenen içerik alacak ve bunun için kolayca test edebilirsiniz.

. Bu AJAX.php için ajax yönlendirmek için temel bir htaccess Ben kurulum:

RewriteEngine On
RewriteRule ajax ajax.php [L]

Aşağıdaki PHP komut ajax içeriğini elde etmeye çalışacaktır. Gerçek script name ajax.php olduğunu. Yönlendirme başarısız olursa, o zaman beklenen içeriğini almazsınız.

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'; 

Son olarak, burada senaryo, ajax.php son parçasıdır. Yönlendirme başarılı olduğunda Bu beklenen yanıtı verir:

echo json_encode('foobar');

Ben bir live example of this test kurulum var, ve ben de mevcuttur full sources yaptık.

As all the awnser already mention, actually testing it is the only way to be sure it works. But instead of actually redirecting to an actual page and waiting for it to load, I would just check the header. In my opinion this is quickly enough to be even used at runtime at a regular site. If it realy needs to be high performance, then ofcourse caching it is better.

Sadece senin. Htaccess dosyasında aşağıdaki gibi bir şey koymak

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

Ve sonra mod_rewrite etkin olup olmadığını kontrol etmek için aşağıdaki php kodu kullanabilirsiniz.

<?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);
?>

çıktı:

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