2009-10-19 13 views
10

Mam problemy z przekazaniem adresu e-mail w adresie URL do aplikacji symfony.Symfony: adres e-mail jako parametr żądania

Adres URL wygląda

example.com/unsubscribe/email/[email protected] 

Zawsze będzie skutkować sfError404Exception, z wyjątkiem sytuacji, gdy okres zostanie usunięty. Po przeprowadzeniu googlingu jedynym rozwiązaniem, jakie widziałem, jest to, że htaccess omija adres URL z powodu obecnego okresu. Jednak, kiedy dodać sugerowaną poprawkę do htaccess, tak:

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

uzyskać taki sam 404. zwraca również 404 podczas korzystania z przedniego kontrolera bezpośrednio w adresie URL (example.com/index.php/unsubscribe/email/[email protected]). Próbowałem umieścić wprowadzoną wersję bezpośrednio w pasku adresu, np. example.com/unsubscribe/me%40example%2Ecom i działa, ale tylko w firefox, nigdzie indziej.

Spędziłem około 2 godzin na forum, szukając google'a w piekle w tym momencie i brakuje mi pomysłów.

Jakieś myśli?

Dzięki.

Aktualizacja: Oto odnośny fragment routing.yml:

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

Aktualizacja: Ślad stosu ... wygląda jak jego nie otrzymuję żadnych informacji o trasach, aby przejść do mnie

404 | Not Found | sfError404Exception 
Empty module and/or action after parsing the URL "/unsubscribe/email/[email protected]" (/). 
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.

+0

+1 jak myślę, że będę działać w ten problem, a także –

Odpowiedz

0

Twój problem nie dotyczy reguł przepisywania. Biorąc pod uwagę, że Symfony rzuca wyjątek, żądanie trafia do Symfony.

Czy możesz zamieścić informacje zwrotne o wyjątku? Jeśli masz sf_logging_enabled, powinieneś zalogować się całkiem użytecznych informacji do debugowania trasy.

+0

Dodałem ślad na ciele zapytania. – pivotal

+0

Hm, wygląda na to, że dostaje adres URL. Czy sf_logging_enabled zawiera szczegółowe informacje o przyczynach niepowodzenia trasy? – six8

3

nie wiem co robisz w Symfony, ale może się to przyczynić się jasne, że poniższe nie jest poprawnym adresem URL:

example.com/unsubscribe/email/[email protected] 

co prawie na pewno chcesz (i to jest prawdziwe dla wszystkich przeglądarki!) to:

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

Uwaga: Symbol @ nie jest bezpieczny i musi być zakodowany,. symbol jest jednak bezpieczny (RFC1738). Jeśli nie unikniesz symbolu @, to prawie na pewno spowoduje to duże kłopoty, więc (ucieczka z. Prawie na pewno nie będzie, ale nie musisz, więc bym tego nie zrobił).

Problemy będą występować, jeśli nie zostaną usunięte, ponieważ @ jest zarezerwowany jako separator podczas przekazywania parametrów uwierzytelniania (np. http://username:[email protected]/url/). Niektóre parsery URL sprawdzą, czy naprawdę chcesz wpisać% 40, jeśli @ występuje po domenie pod adresem URL, ale inne nie.

Zamiast statycznie kodować symbol @, należy użyć jednej z funkcji kodowania adresów URL w PHP na adres e-mail (np. "$ EmailAddress = urlencode($emailAddress);"), aby upewnić się, że inne znaki w adresie również zostały poprawnie usunięte.Nie ulegaj pokusie, aby zostawić to na później lub "po tym, jak to działa", rób to od samego początku i uratuj siebie i użytkowników końcowych przed bólem głowy! :-)

NB: Istnieje kilka sposobów kodowania adresów URL w PHP, więc musisz przeczytać stronę dokumentacji urlencode() i porównać ją z innymi metodami, takimi jak rawurlencode(), aby upewnić się, że to jest to, co naprawdę chcę w twoim przypadku.

+0

Dzięki, planowałem użyć wersji "@" z funkcją "Escape", ale niestety nie wydaje mi się to problemem - bez względu na to, czy znak ampersand został usunięty, nieodwracalny, czy zupełnie nieobecny, to jednak czas wciąż jest w stanie rzucić off symfony:/ – pivotal

+0

Ah ciekawe! Myślę, że nave go tam przybiłeś. Spojrzałem i wydaje mi się, że dzieje się tak z innymi ludźmi i jest to "znany problem" - wydaje się, że konfiguracje .htaccess, które pochodzą z Symfony (lub że są polecane) powodują. do interpretacji! Wygląda na to, że zawiera odpowiedzi na post tutaj: http://www.mail-archive.com/[email protected]/msg08689.html Ponieważ nie wiem, jak mogę Symfony 't daj kopię + wklej przykład, ale sugestie, jak zmienić. Htaccess, aby naprawić to w odpowiedziach mają sens - powodzenia! 8) –

9

Domyślnie Symfony traktuje . i / jako separatory parametrów.
To sprawia, że ​​bardzo łatwo dopasować url tak:

/some/path/:param.:ext 

Ale nie pomaga z adresami e-mail.

Na szczęście można zastąpić separator ., określając własny wzór.
Wystarczy dodać linię requirements poniżej do ułożenia:

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

.+ w wymogiem jest wyrażenie regularne pasujące do niczego. The . pasuje do dowolnej postaci, a + oznacza dopasowanie jednego lub więcej.

(Testowany w Symfony 1.4)

+0

+1 Dobra odpowiedź! –

+0

Jeśli używasz wielu parametrów po adresie e-mail, możesz zamiast tego używać "[^ \ /] +", aby nie pasowało do ukośników na trasie. – fyrye