Mam projekt, który wymaga od moich adresów URL kropek na ścieżce. Na przykład mogę mieć adres URL, taki jak www.example.com/people/michael.phelps
Adresy URL z kropką generują 404. Mój routing jest w porządku. Jeśli przejdę przez Michaelphelpsa, bez kropki, wszystko będzie działać. Po dodaniu kropki pojawia się błąd 404. Przykładowa witryna działa w systemie Windows 7 z IIS8 Express. URLScan nie działa.
Próbowałem dodać do mojego pliku web.config:
<security>
<requestFiltering allowDoubleEscaping="true"/>
</security>
Niestety nie miało to znaczenia. Właśnie otrzymałem błąd 404.0 Nie znaleziono.
To jest projekt MVC4, ale nie sądzę, żeby to miało znaczenie. Moje routing działa dobrze i oczekiwane parametry są dostępne, dopóki nie zawierają kropki.
Co muszę skonfigurować, aby mieć kropki w moim adresie URL?
Odpowiedzi:
Udało mi się to, edytując programy obsługi HTTP mojej witryny. Na moje potrzeby działa to dobrze i rozwiązuje mój problem.
Po prostu dodałem nowy moduł obsługi HTTP, który szuka określonych kryteriów ścieżki. Jeśli żądanie jest zgodne, jest poprawnie wysyłane do platformy .NET w celu przetworzenia. Jestem znacznie bardziej zadowolony z tego rozwiązania, że URLRewrite włamuje się lub włącza RAMMFAR.
Na przykład, aby .NET przetworzył adres URL www.example.com/people/michael.phelps, dodaj następujący wiersz do web.config swojej witryny w
system.webServer / handlers
elemencie:Edytować
Istnieją inne posty sugerujące, że rozwiązaniem tego problemu jest
RAMMFAR
lubRunAllManagedModulesForAllRequests
. Włączenie tej opcji spowoduje włączenie wszystkich zarządzanych modułów dla wszystkich żądań. Oznacza to, że pliki statyczne, takie jak obrazy, pliki PDF i wszystko inne będą przetwarzane przez .NET, gdy nie będą potrzebne. Opcję tę najlepiej pozostawić, chyba że masz do tego konkretny przypadek.źródło
Po krótkiej analizie okazało się, że zrelaksowaneUrlToFileSystemMapping w ogóle mi nie działało, w moim przypadku działało ustawienie RAMMFAR na true, to samo dotyczy (.net 4.0 + mvc3) i (.net 4.5 + mvc4).
Pamiętaj, ustawiając RAMMFAR prawdziwy wpis Hanselmana o RAMMFAR i wydajności
źródło
Uważam, że musisz ustawić właściwość zrelaksowanyUrlToFileSystemMapping w pliku web.config. Haack napisał o tym artykuł jakiś czas temu (i są też inne posty SO zadające takie same pytania)
Edycja Z poniższych komentarzy, późniejsze wersje .NET / IIS mogą wymagać tego w
system.WebServer
elemencie.źródło
Utknąłem w tej sprawie przez długi czas, korzystając z różnych środków bezskutecznie.
Zauważyłem, że dodanie ukośnika [/] na końcu adresu URL zawierającego kropki [.] Nie spowodowało błędu 404 i faktycznie działało.
W końcu rozwiązałem ten problem za pomocą przepisywania adresów URL, takiego jak IIS URL Rewrite, w celu wyszukania określonego wzorca i dodania slashu szkoleniowego.
Mój adres URL wygląda następująco: /Contact/~firstname.lastname, więc mój wzór to po prostu: /Contact/~(.*[^/])$
Ten pomysł dostałem od Scott Forsyth, patrz link poniżej: http://weblogs.asp.net/owscott/handing-mvc-paths-with-dots-in-the-path
źródło
Wystarczy dodać tę sekcję do Web.config, a wszystkie żądania do trasy / {* pathInfo} będą obsługiwane przez określony moduł obsługi, nawet jeśli w pathInfo występują kropki. (wzięty z przykładu Web.config hosta ServiceStack MVC i tej odpowiedzi https://stackoverflow.com/a/12151501/801189 )
Powinno to działać zarówno w IIS 6, jak i 7. Można przypisać określone procedury obsługi do różnych ścieżek po „route”, modyfikując path = „*” w elementach „add”
źródło
Obejście MVC 5.0.
Wiele sugerowanych odpowiedzi wydaje się nie działać w MVC 5.0.
Ponieważ problem 404 kropek w ostatniej sekcji można rozwiązać, zamykając tę sekcję ukośnikiem końcowym, oto mała sztuczka, której używam, czysta i prosta.
Zachowując wygodny symbol zastępczy w widoku:
dodaj trochę jquery / javascript, aby wykonać zadanie:
zwróć uwagę na ukośnik końcowy, który jest odpowiedzialny za zmianę
w
źródło
Bardzo łatwa odpowiedź dla tych, którzy mają to tylko na jednej stronie internetowej. Edytuj link akcji i znak „/” na jego końcu.
źródło
Możesz pomyśleć o użyciu myślników zamiast kropek.
W Pro ASP MVC 3 Framework sugerują to, aby tworzyć przyjazne adresy URL:
Wspomina również, że adresy URL powinny być łatwe do odczytania i zmiany dla ludzi. Być może powód, dla którego warto pomyśleć o użyciu myślnika zamiast kropki, również pochodzi z tej samej książki:
Tak więc, chociaż okres jest nadal czytelny dla ludzi (choć mniej czytelny niż myślniki, IMO), może być nieco mylący / wprowadzający w błąd w zależności od tego, co nastąpi po tym okresie. Co jeśli ktoś ma nazwisko zip? Wtedy URL będzie miał postać /John.zip zamiast / John-zip, co może wprowadzać w błąd nawet dla programisty, który napisał aplikację.
źródło
.
) myślnikami w adresach URL użytkowników: PW zależności od tego, jak ważne jest zachowanie identyfikatora URI bez kwerend, możesz również przekazać wartość za pomocą kropek jako części kwerendy, a nie identyfikatora URI.
Np. Www.example.com/people?name=michael.phelps będzie działał bez konieczności zmiany jakichkolwiek ustawień lub czegokolwiek.
Tracisz elegancję posiadania czystego identyfikatora URI, ale to rozwiązanie nie wymaga zmiany ani dodawania żadnych ustawień ani procedur obsługi.
źródło
Czy można zmienić strukturę adresu URL?
Do tego, nad czym pracowałem, próbowałem trasy
ale zawiodło z czymkolwiek, co miało. w tym.
Zmieniłem trasę na
Teraz mogę włożyć
localhost:xxxxx/File1.doc/Download
i działa dobrze.Moi pomocnicy w widoku również to zauważyli
tworzy również link do
localhost:xxxxx/File1.doc/Download
formatu.Być może możesz umieścić niepotrzebne słowo, takie jak „/ view” lub akcję na końcu trasy, aby Twoja nieruchomość mogła zakończyć się ciągnięciem
/
czegoś w rodzaju/mike.smith/view
źródło
To tak proste, jak zmiana ścieżki = " ." do ścieżki = " ". Wystarczy usunąć kropkę na ścieżce dla ExensionlessUrlHandler-Integrated-4.0 w pliku web.config.
Oto fajny artykuł https://weblog.west-wind.com/posts/2015/Nov/13/Serving-URLs-with-File-Extensions-in-an-ASPNET-MVC-Application
źródło
Wypróbowałem wszystkie powyższe rozwiązania, ale żadne z nich nie działało dla mnie. Co zadziałało, odinstalowałem wersje .NET> 4.5, w tym wszystkie wersje wielojęzyczne; W końcu dodałem nowsze wersje (tylko w języku angielskim) kawałek po kawałku. Obecnie wersje zainstalowane w moim systemie są następujące:
I nadal działa w tym momencie. Boję się zainstalować 4.6.2, ponieważ może to wszystko popsuć.
Mogłem więc jedynie spekulować, że albo 4.6.2, albo wszystkie te wersje nieangielskie popsuły moją konfigurację.
źródło
Byłem w stanie rozwiązać moją konkretną wersję tego problemu (musiałem /customer.html trasy do / klienta, końcowe ukośniki nie były dozwolone) przy użyciu rozwiązania na https://stackoverflow.com/a/13082446/1454265 i zastąpienia ścieżki = „*. html”.
źródło
Jako rozwiązanie można również rozważyć kodowanie do formatu, który nie zawiera symbolu
.
, jak base64.W js należy dodać
W kontrolerze
źródło
Dodaj regułę przepisywania adresów URL do archiwum Web.config. Musisz mieć moduł URL Rewrite już zainstalowany w IIS. Użyj poniższej reguły przepisywania jako inspiracji dla własnej.
źródło
Ponadto (powiązane) sprawdź kolejność mapowań programu obsługi. Mieliśmy .ashx z .svc (np. /Foo.asmx/bar.svc/path) na ścieżce po nim. Mapowanie .svc było po raz pierwszy tak 404 dla ścieżki .svc, która pasowała przed .asmx. Hav nie myślał za dużo, ale może adres URL ścieżki zakodowałby to.
źródło
źródło