Symfony: istek parametresi olarak e-posta adresi

3 Cevap php

Ben bir Symfony app bir url bir e-posta adresi ile geçen bazı sorunlar yaşıyorum.

Url benziyor

example.com/unsubscribe/email/me@example.com

Bu zaman süresi kaldırıldığında dışında, sfError404Exception neden olur. Etrafında Googling bazı yaptıktan sonra, henüz gördüm tek çözüm bu htaccess çünkü dönem mevcut url atlayarak olduğunu. Ancak, ben gibi, htaccess önerilen düzeltme eklediğinizde:

# we skip all files with .something
RewriteCond %{REQUEST_URI} \..+$
RewriteCond %{REQUEST_URI} !@.+    #skip email address
RewriteCond %{REQUEST_URI} \.epl$
RewriteCond %{REQUEST_URI} !\.html$ 
RewriteCond %{REQUEST_URI} !\.rhtml$
RewriteRule .* - [L]

Ben aynı 404 olsun. Ben url doğrudan ön denetleyicisi kullandığınızda Ayrıca 404 döndürür (example.com/index.php/unsubscribe/email/me@example.com). Ben mesela example.com/unsubscribe/me%40example%2Ecom, adres çubuğuna doğrudan kaçtı sürümünü koyarak denedim ve bu işleri, ama sadece firefox, başka hiçbir yerde.

Ben bu noktada cehennem Googling forum cevap yaklaşık 2 saat geçirdim ve ben fikir tükeniyor.

Herhangi bir düşünce?

Teşekkürler.

Güncelleme: İşte routing.yml ilgili bölümü:

unsubscribeform:
  url:  /unsubscribe/email/:email
  param: { module: subscribe, action: index }

Update: onun bana gitmek için herhangi bir rota bilgi almak değil gibi Stack iz görünüyor ...

404 | Not Found | sfError404Exception
Empty module and/or action after parsing the URL "/unsubscribe/email/me@example.com" (/).
stack trace

1. at ()
  in SF_SYMFONY_LIB_DIR/controller/sfFrontWebController.class.php line 44 ...
          41.
          42.       if (empty($moduleName) || empty($actionName))
          43.       {
          44.         throw new sfError404Exception(sprintf('Empty module and/or action after parsing the URL "%s" (%s/%s).', $request->getPathInfo(), $moduleName, $actionName));
          45.       }
          46.
          47.       // make the first request
2. at sfFrontWebController->dispatch()
  in SF_SYMFONY_LIB_DIR/util/sfContext.class.php line 159 ...
         156.    */
         157.   public function dispatch()
         158.   {
         159.     $this->getController()->dispatch();
         160.   }
         161.
         162.   /**
3. at sfContext->dispatch()
  in /home/web/htdocs/index.php line 10 ...
           7. require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'ProjectConfiguration.class.php');
           8.
           9. $configuration = ProjectConfiguration::getApplicationConfiguration(SF_APP, SF_ENVIRONMENT, SF_DEBUG);
          10. sfContext::createInstance($configuration)->dispatch();

11.

3 Cevap

By default, Symfony treats . and / as parameter separators.
That makes it very easy to match a url like so:

/some/path/:param.:ext

Ama e-posta adresleri ile yardımcı olmuyor.

Fortunately, you can override the . separator by specifying your own pattern.
Just add the requirements line below to your routing:

unsubscribeform:
  url:  /unsubscribe/email/:email
  param: { module: subscribe, action: index }
  requirements: { email: .+ }

.+ gereksinimi şey eşleşen bir düzenli ifadedir. . herhangi bir karakterle eşleşir ve + maç tek-veya-daha fazla anlamına gelir.

(Symfony 1.4 Tested)

Ben Symfony'de ne yaptığını bilmiyorum ama şu geçerli bir URL olmadığı açıktır olmak için yardımcı olabilir:

example.com/unsubscribe/email/me@example.com

Neredeyse kesinlikle (! Ve bu tüm tarayıcılar için geçerlidir) istediğiniz nedir:

http://example.com/unsubscribe/email/me%40example.com

Not: @ sembolü güvenli değildir ve kodlanmış gerekir. ancak güvenli bir sembol (RFC1738). Eğer @ sembolü kaçmak yoksa neredeyse kesinlikle (neredeyse kesinlikle olmaz. Kaçan, ama bunu yapmazdım gerek yok) çok büyük sorun neden olur.

Sorunları doğrulama parametreleri geçerken @ ayırıcı olarak ayrılmıştır çünkü kaçan değil ortaya çıkar (örneğin, http://username%3Apassword@hostname.domain/url/). Bazı URL ayrıştırıcılar gerçekten @ URL etki sonra oluşur, ama diğerleri olmaz ise% 40 yazmanız anlamına geliyordu çalışacaktır.

Aksine sadece statik Eğer e-posta adresi PHP'nin URL kodlama işlevlerden birini kullanmanız gerekir @ sembolü şifreleyen daha, adresi, diğer karakterleri sağlamak için ("$ emailAddress = urlencode($emailAddress)" gibi) da düzgün kaçtı vardır. Kadar sonra veya bu bırakmak için cazip olmayın 'Eğer bu çalışma sonrasında' baştan yapmak ve bir baş ağrısı kendinizi ve son kullanıcılara tasarruf edin! :-)

NB: Orada PHP URL kodlamak için çeşitli yolları vardır, bu yüzden urlencode için dokümantasyon sayfasında () aracılığıyla okumak gerekir ve bu gerçekten sizin durumunuzda ne istediğinizi emin olmak için rawurlencode gibi diğer yaklaşımlar () ile karşılaştırın.

Sorununuz Rewrite Kuralları ile değildir. Symfony sonra istek Symfony'de bunu yapıyor istisna atıyor düşünüyor.

Eğer istisna için traceback gönderebilir miyim? Eğer sf_logging_enabled varsa o yönlendirme hata ayıklama için bazı oldukça yararlı bilgiler giriş yapmalıdır.