Ich mache eine Route wie
Route::get('/{url1}', function ($url1) {
return ' url1: '.$url1;
})
->where('url1', '^(?!(string1|string2)$)');
und Zugriff URL wie:
- domain/abc
nicht gefunden => falsch ?
- domain/string1
nicht gefunden => richtig
und mehr, wenn ich mit mache
Route::get('/{url1}/{url2}', function ($url1) {
return ' url1: '.$url1;
})
->where('url1', '^(?!(string1|string2)$)');
und Zugriff URL wie:
- domain/abc/abc
nicht gefunden => falsch ???
- domain/string1/abc
nicht gefunden => richtig
Wie man das behebt, danke
Antworten:
Bitte versuchen Sie dies für das erste Szenario:
für das 2. Szenario:
Ich hoffe diese Hilfe :)
quelle
domain/abc
aber es ist nicht gefunden?Versuche dies
Unreiner Weg, um dies zu erreichen
Eine weitere Möglichkeit habe ich mit versucht
RouteServiceProvider.php
Ändere dein
boot()
so.quelle
domain/string1
es einfach => es wurde immer noch gefundens excluding
127.0.0.1:8000/domain/string2,
127.0.0.1:8000/domain/string1 `und arbeitet fürhttp://127.0.0.1:8000/domain/abc
domain
,domain
wiehttp://127.0.0.1:8000
und du solltest es versuchen127.0.0.1:8000/string1
, ...RouteServiceProvider
.Nach Tests denke ich, dass es unmöglich ist, genau das zu erreichen, was Sie wollen. Es scheint, wenn Sie ausschließen möchten
string1
undstring2
Sie müssen zustimmen, dass auch Zeichenfolgen, die mit beginnenstring1
undstring2
ausgeschlossen werden (so zum Beispielstring1aaa
).Bei Verwendung solcher Routen:
Ergebnis wird sein:
Ich glaube, eine solche Einschränkung kommt von Laravel und nicht von Regex. Wenn Sie auch Parameter akzeptieren müssen, die mit beginnen,
string1
undstring2
ich glaube, Sie müssen dies manuell tun:quelle
Versuchen Sie diesen regulären Ausdruck:
quelle
http://domain/string1/abc
noch gefunden?Anstatt eine Route zu schreiben, die mit etwas anderem als bestimmten statischen Zeichenfolgen übereinstimmt , finde ich es klarer, zwei Routen zu schreiben: eine Route, die mit bestimmten statischen Zeichenfolgen übereinstimmt, und eine andere Route, die mit allem anderen übereinstimmt.
Was zu * führt :
domain
=> 200 gefundendomain/
=> 200 gefundendomain/abc
=> 200 gefundendomain/string1
=> 404 Nicht gefundendomain/string1/
=> 404 Nicht gefundendomain/string1/abc
=> 404 Nicht gefundendomain/string10
=> 200 gefundendomain/string10/
=> 200 gefundendomain/string10/abc
=> 200 gefundendomain/string2
=> 404 Nicht gefundendomain/string2/
=> 404 Nicht gefundendomain/string2/abc
=> 404 Nicht gefundendomain/string20
=> 200 gefundendomain/string20/
=> 200 gefundendomain/string20/abc
=> 200 gefundenIch finde das klarer, weil ich nicht in Ausschlüssen denken muss. Ich kann mir vielmehr vorstellen, genau das zu finden, was ich verbieten möchte, und dann Laravel auf alles andere reagieren zu lassen (Fail Open Policy). Dies entspricht möglicherweise nicht Ihren Entwurfskriterien, aber ich glaube, dass dies zu einem klareren Code führt.
Außerdem ist der Code leistungsfähiger.
?!
muss zurückverfolgen, was per Definition teurer ist als Forward Matching.Ich habe keine Laravel-Umgebung zur Hand, aber ich riskiere eine Vermutung, warum Ihre Versuche nicht funktioniert haben. Laravel verwendet Symfony Router, der keine Lookarounds für Slugs unterstützt . IIRC: Wenn eine Lookaround erkannt wird, wendet Symfony die Lookaround auf die gesamte URL an, nicht auf den Slug, an den Sie das Muster gebunden haben. Dies steht im Widerspruch zu der Vorstellung des Entwicklers, wie Anker (^, $) und gierige (*) Metazeichen funktionieren. Dies kann zu einer schlechten Erfahrung beim Versuch führen, es zum Laufen zu bringen, da der Entwickler unter einer Annahme arbeitet, die zugrunde liegenden Bibliotheken jedoch unter einer anderen.
* Vollständige Offenlegung, ich habe dies für Lumen geschrieben und es dann mental in das Laravel-Format konvertiert. Möglicherweise gibt es einige Übersetzungsfehler. Hier ist das ursprüngliche Lumen:
quelle