2012-05-01 27 views
6

To pytanie jest w pewnym stopniu związane z moim previous question. Sztuczka używania $_SERVER['REDIRECT_QUERY_STRING'] wydaje się działać tylko dla zmiennych $_GET.

Cóż, mam plik index.php, który obsługuje wszystkie 404 redirects.

Jeżeli wnioski użytkowników na stronie, która nie robi istnieją, mówią apple.php?item=23, a następnie za pomocą $_SERVER['REDIRECT_QUERY_STRING'] mogę uzyskać $_GET zmienną item=23, ale jeśli zmienna nie $_GET ale $_POST jest następnie $_SERVER['REDIRECT_QUERY_STRING'] nie działa.

Jak mogę uzyskać $_POST zmienną kiedy przekierować go do index.php stosując następujący .htaccess ustawienia

ErrorDocument 404 /index.php

+1

To nie jest "sztuczka", to po prostu straszne rozwiązanie. Dlaczego nie używać 'mod_rewrite'? ps: nie, po przekierowaniu 404 masz już utracone dane pocztowe i nie możesz tego uzyskać – zerkms

+0

nie jestem pewien, ale myślę, że stracisz wszystkie dane POST podczas przekierowania. Do czego ci to potrzebne? może jest inny sposób. – miro

+0

Należy zauważyć, że nie ma czegoś takiego jak przekierowanie "404". Kody odpowiedzi 4xx oznaczają błąd klienta (404 wskazuje, że zasób żądany przez klienta nie istnieje na serwerze), kody 3xx służą do przekierowania.Jeśli chcesz zmusić klienta do ponownego przesłania i identycznego żądania POST do nowego identyfikatora URI, powinieneś użyć kodu statusu 307. Ale podejrzewam, że to, czego faktycznie używasz, to "RewriteCond% {REQUEST_FILENAME}! -f" i "RewriteCond% {REQUEST_FILENAME}! -d', aby przepisać żądania dla plików, które nie istnieją w określonym skrypcie. – DaveRandom

Odpowiedz

7

Sprawdź odpowiedź tutaj: http://www.brainonfire.net/blog/apache-pitfall-errordocument-post/

mi rozwiązać mój problem za pomocą tego.


lub umieścić to w pliku .htaccess:

 

    RewriteEngine On 
    RewriteBase/


    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule . /yourErrorDocument.php [L] 

+0

Nie działałem - brakuje zarówno __SERVER ['REQUEST_METHOD'], jak i $ _POST (php 5.4.12) –

5

z następującą dyrektywę:

ErrorDocument 404 /index.php 

apache webserver wykonuje wewnętrzne przekierowanie do nowej lokalizacji. Środki wewnętrzne, klient (przeglądarka) nie zmieni adresu URL w pasku adresu, ponieważ przekierowanie nie jest przekazywane do przeglądarki.

Ponieważ jest to przekierowanie, żądanie POST jest przekształcane w żądanie GET.

Można to zobaczyć patrząc na dwie następujące $_SERVER zmiennych:

$_SERVER['REDIRECT_REQUEST_METHOD'] # POST 
$_SERVER['REQUEST_METHOD'] # GET 

Tak w skrócie, nie można używać ErrorDocument directive zrobić przepisywanie URL dla żądań HTTP POST.

Do tego celu należy użyć mod_rewrite module lub utworzyć własną procedurę obsługi apache.

+0

Dzięki, rozwiązałem problem za pomocą pomysłu DaveRandoma :) Anways, dzięki tobie też za pomoc :) –

+0

To najprostszy sposób, aby nie dostać się do danych pocztowych. –

+2

@JackFranzen: Oh, istnieje również dyrektywa [** 'FallbackResource' **] (https://httpd.apache.org/docs/current/mod/mod_dir.html#fallbackresource), która nie ma POST ograniczenia omówione w tej odpowiedzi. Zobacz także http://stackoverflow.com/a/8196767/367456 i http://stackoverflow.com/a/7968869/367456 gdzie omówiłem to wcześniej. – hakre

2

użyć dyrektywy FallbackResource zamiast dyrektywy Apache ErrorDocument: to załatwia sprawę FallbackResource on Apache website

Przykład:

FallbackResource /404.php 
+0

To jest rozwiązanie, które działało dla tego, czego potrzebowałem. Dziękujemy za udostępnienie. Jedna ważna uwaga dla osób wdrażających to rozwiązanie: Będziesz musiał określić rzeczywisty plik według nazwy. Na przykład w moim projekcie poprzednio miałem "ErrorDocument 403/router /" jako moją dyrektywę bez określania "index.php" na końcu. Kiedy próbowałem "FallbackResource/router /", nie udało się, dopóki nie zmieniłem go na "FallbackResource /router/index.php". –

+0

Zobacz także ten wpis, który powinien zaoszczędzić ci godziny na próbie debugowania, dlaczego nie działa z głównym punktem końcowym "/": https://serverfault.com/questions/512735/fallbackresource-directive-works- dla-any-uri-except –

Powiązane problemy