Ich muss eine Website erstellen, die Artikel enthält, und ich möchte freundliche URLs dafür erstellen, z. B. die URL der Seite mit
Titel: Artikel Test
soll werden: http://www.example.com/articles/article_test
.
Natürlich muss ich einige Zeichen aus dem Titel entfernen wie ?
oder #
, aber ich bin nicht sicher, welche ich entfernen soll.
Kann mir jemand sagen, welche Charaktere sicher sind?
So zitieren Sie Abschnitt 2.3 von RFC 3986 :
"Zeichen, die in einem URI zulässig sind, aber keinen reservierten Zweck haben, werden als nicht reserviert bezeichnet. Dazu gehören Groß- und Kleinbuchstaben, Dezimalstellen, Bindestrich, Punkt, Unterstrich und Tilde."
ALPHA DIGIT "-" / "." / "_" / "~"
Beachten Sie, dass RFC 3986 weniger reservierte Interpunktionszeichen auflistet als das ältere RFC 2396 .
Es gibt zwei Arten von Zeichen, auf die Sie achten müssen: reserviert und nsicher.
Die reservierten Zeichen sind:
Die Zeichen, die allgemein als nsicher betrachtet werden, sind:
Ich habe vielleicht einen oder mehrere vergessen, was dazu führt, dass ich Carl Vs Antwort wiederhole. Auf lange Sicht ist es wahrscheinlich besser, eine "weiße Liste" zulässiger Zeichen zu verwenden und die Zeichenfolge dann zu codieren, als zu versuchen, mit Zeichen Schritt zu halten, die von Servern und Systemen nicht zugelassen werden.
Sie behalten am besten nur einige Zeichen (Whitelist) bei, anstatt bestimmte Zeichen (Blacklist) zu entfernen.
Sie können technisch jedes Zeichen zulassen, solange Sie es richtig codieren. Zur Beantwortung dieser Frage sollten Sie jedoch nur die folgenden Zeichen zulassen:
Alles andere hat möglicherweise eine besondere Bedeutung. Sie können beispielsweise annehmen, dass Sie + verwenden können, es kann jedoch durch ein Leerzeichen ersetzt werden. & ist auch gefährlich, insbesondere wenn einige Umschreiberegeln verwendet werden.
Überprüfen Sie wie bei den anderen Kommentaren die Normen und Spezifikationen für vollständige Details.
Diese sind (in der Theorie/Spezifikation) sicher, im Grunde genommen überall außer dem Domain-Namen.
Prozentcodieren Sie alles, was nicht aufgeführt ist, und Sie können loslegen.
A-Z a-z 0-9 - . _ ~ ( ) ' ! * : @ , ;
Nur sicher, wenn in bestimmten URL-Komponenten verwendet; mit Vorsicht verwenden.
Paths: + & =
Queries: ? /
Fragments: ? / # + & =
Gemäß der URI-Spezifikation (RFC 3986) müssen alle anderen Zeichen in Prozent codiert sein. Das beinhaltet:
<space> <control-characters> <extended-ascii> <unicode>
% < > [ ] { } | \ ^
Wenn maximale Kompatibilität von Bedeutung ist, beschränken Sie den Zeichensatz auf A-Z a-z 0-9 - _.
(mit Punkten nur für Dateinamenerweiterungen).
Wenn Sie sich RFC3986 - Uniform Resource Identifier (URI): Generic Syntax ansehen, dreht sich Ihre Frage um die Pfadkomponente eines URI.
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment | _____________________|__ / \ / \ urn:example:animal:ferret:nose
In Abschnitt 3.3 sind gültige Zeichen für einen URI segment
vom Typ pchar
:
pchar = unreserviert/pct-codiert/untergeordnet/":"/"@"
Welches gliedert sich in:
ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded
"!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
":" / "@"
Oder mit anderen Worten: Sie können ein beliebiges (Nicht-Steuer-) Zeichen aus der ASCII-Tabelle , ausgenommen/
, ?
, #
, [
Und ]
.
Dieses Verständnis wird durch RFC1738 - Uniform Resource Locators (URL) gestützt.
nicht reserviert = ALPHA/DIGIT/"-"/"."/"_"/"~"
Aus dem von Ihnen beschriebenen Kontext gehe ich davon aus, dass es sich bei dem, was Sie tatsächlich machen wollen, um einen so genannten SEO-Slug handelt. Die allgemein bekannteste Praxis für diese ist:
Als Beispiel würde ein Artikel mit dem Titel "Die Verwendung von! @% $ * Zur Darstellung von Fluchen in Comics" eine Menge "Verwendung-Fluchen-Comics" enthalten.
Das Format für einen URI ist in RFC 3986 definiert. Einzelheiten finden Sie in Abschnitt 3.3.
Aus SEO-Sicht werden Bindestriche gegenüber Unterstrichen bevorzugt. In Kleinbuchstaben konvertieren, alle Apostrophe entfernen und dann alle nicht alphanumerischen Zeichenfolgen durch einen einzelnen Bindestrich ersetzen. Schneiden Sie überschüssige Bindestriche am Anfang und Ende ab.
Ich hatte ein ähnliches Problem, ich wollte hübsche URLs haben und kam zu dem Schluss, dass ich nur Buchstaben, Ziffern und _ in URLs zulassen muss. Das ist in Ordnung, dann habe ich ein paar nette reguläre Ausdrücke geschrieben und festgestellt, dass alle UTF8-Zeichen keine Buchstaben in .NET sind und verschraubt wurden. Dies scheint ein bekanntes Problem für die .NET-Regex-Engine zu sein. SO Ich bin zu dieser Lösung gekommen:
private static string GetTitleForUrlDisplay(string title)
{
if (!string.IsNullOrEmpty(title))
{
return Regex.Replace(Regex.Replace(title, @"[^A-Za-z0-9_-]", new MatchEvaluator(CharacterTester)).Replace(' ', '-').TrimStart('-').TrimEnd('-'), "[-]+", "-").ToLower();
}
return string.Empty;
}
/// <summary>
/// All characters that do not match the patter, will get to this method, i.e. useful for unicode chars, because
/// .NET impl of regext do not handle unicode chars. So we use char.IsLetterOrDigit() which works nicely and we
/// return what we approve and return - for everything else.
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private static string CharacterTester(Match m)
{
string x = m.ToString();
if (x.Length > 0 && char.IsLetterOrDigit(x[0]))
{
return x.ToLower();
}
else
{
return "-";
}
}
Ich fand es sehr nützlich, meine URL in eine sichere zu verschlüsseln, als ich einen Wert über ajax/php an eine URL zurückgab, die dann erneut von der Seite gelesen wurde.
PHP-Ausgabe mit URL-Encoder für das Sonderzeichen &
//PHP returning the sucess info of ajax request
echo "".str_replace('&','%26',$_POST['name'])." category was changed";
//javascript sending the value to url
window.location.href='time.php?return=updated&val='+msg;
//javascript/php executing the function printing the value of the url,
//now with the text normally lost in space because of the reserved & character.
setTimeout("infoApp('updated','<?php echo $_GET['val'];?>');",360);
Hoffe, jemand findet meine kleinen Code-Auszüge nützlich! :)
Ich denke, Sie suchen nach etwas wie "URL-Kodierung" - Kodierung einer URL, damit die Verwendung im Web "sicher" ist:
Hier ist eine Referenz dafür. Wenn Sie keine Sonderzeichen möchten, entfernen Sie einfach alle Zeichen, die eine URL-Codierung erfordern: