Я заметил, что большинство маршрутов PHP-фреймворков (все) не используют записанную точку URL и PHP-автономный-сервер также не использует точки (обратите внимание, что PHP-автономный-сервер не нужно mod_rewrite, обычно это работает). Это шаблон, я избегаю точек переписанных URL-адресов?
Если я бегу PHP-автономный-сервер в этой папке структуры:
project
│ index.php
│ test.php
│
└── blog1
└── index.html
И доступ http://localhost:8000/test.php
покажи ответ от ./test.php
файл. Если я получу доступ http://localhost:8000/blog1
он показывает содержимое из blog1/index.html
, Это потому, что именно так phpstand обеспечивает встроенную поддержку перезаписи URL, но это не проблема.
Но если я получу доступ http://localhost:8000/blog
покажи ответ от ./index.php
,
Собственный стековый поток является примером, который заменяет точки дефисами, например, этот вопрос:
Why not use the dot (“.”) in url rewrite?
http://stackoverflow.com/questions/29977809/why-not-use-the-dot-in-url-rewrite
Примером фреймворка php является CodeIgniter-3, это не разрешать точки.
Понимаю это, мне интересно, должен ли я разрешить точки («.») В URL переписывания или нет? Не использовать точки это «стандарт»?
Наконец нашел причину этой «полемики», когда я искал (гуглил) термин Точка пути RFC
.
в URLМожно использовать точки в URL (даже переписанные), такие как:
http://example/project/hello-new-world
или предполагая, что мы создадим URL false
как:
http://example/project/index.php/hello-new-world.html
Проблема возникает, когда использовать так:
http://example/project/test./
К серверу /project/test./
а также /project/test/
это одно и то же, но видно, что нет.
Обратите внимание, что проблема не возникает, если вы делаете это
/project/.test/
, так как есть файлы, которые начинаются только с точки, как.htaccess
Причина, по которой переписанные URL-адреса не используют точки, чтобы предотвратить это или облегчить канонизацию URL-адресов (нормализация URL-адресов).
Более понятный пример проблемы — создать файл в вашей физической папке на локальном хосте:
/var/www/images/test.jpg
Идти к http: //localhost/images/test.jpg
а затем попробуйте получить доступ ко всем этим:
http://localhost/images/test.jpg.
http://localhost/images/test.jpg...
http://localhost/images/test.jpg....
http://localhost/images/test.jpg.....
http://localhost/images/test.jpg......
http://localhost/images/test.jpg.......
Все URL доставляются клиенту (например, веб-браузер) в виде изображения test.jpg
,
Нормализация URL (или канонизация URL) — это процесс, с помощью которого URL изменяются и стандартизируются согласованным образом. Целью процесса стандартизации является превращение URL в standard URL
или канонический, чтобы вы могли определить, могут ли два разных URL быть синтаксически эквивалентными.
Поисковые системы используют URL-адрес стандартизации для придания важности веб-страницам и сокращения индексации дублированных страниц. Сканеры выполняют нормализацию URL, чтобы избежать отслеживания одного и того же ресурса более одного раза.
Типы стандартизации (следующая нормализация описывается RFC 3986):
Удаление индекса каталога. Индексы каталога по умолчанию обычно не требуются в URL:
http://www.example.com/a/index.html
→ http://www.example.com/a/
Замена IP доменного имени. Убедитесь, что IP-адрес соответствует каноническому имени домена:
http://208.77.188.166/
→ http://www.example.com/
(то, что помогает это заголовок Host: domain
)
Удаление повторяющихся путей резки, которые включают в себя две соседние полосы, можно преобразовать в:
http://www.example.com/foo//bar.html
→ http://www.example.com/foo/bar.html
Удаление или добавление www
в качестве первой метки домена. Оба URL часто указывают на одинаковые страницы:
http://www.example.com/
→ http://example.com/
Удаление ?
когда запрос пуст. Когда запрос пуст, может не понадобиться ?
:
http://www.example.com/display?
→ http://www.example.com/display
добавлять /
в каталогах:
http://www.example.com/alice
→ http://www.example.com/alice/
(обычно сервер с Apache и Nginx уже выполняет перенаправление, если это настоящая папка).
Однако нет способа узнать, является ли компонент пути URL каталогом или нет. RFC 3986 обратите внимание, что если URL перенаправляет на предыдущий пример URL, это указывает на то, что они эквивалентны.
Удаление сегментов точек (dot-сегментов). Сегмент ..
а также .
Его можно удалить из URL в соответствии с алгоритмом, описанным в RFC 3986:
http://www.example.com/../a/b/../c/./d.html
→ http://www.example.com/a/c/d.html
Однако, если удален ..
компонент, например b/..
, является символической ссылкой на каталог с другим родителем, eliding b/..
приведет к другому пути и URL. В редких случаях, в зависимости от веб-сервера, это может быть даже верно для корневого каталога (например, //www.example.com/..
не может быть эквивалентно //www.example.com/
, (это вероятная причина, чтобы избежать .
)
Тогда вы спросите меня: Я должен тогда избежать точек в моих переписывающих URL-адресах?
Я говорю, что это решение, но не единственное, если вы используете mod_rewrite
вероятно, использует такой язык, как PHP в качестве примера, и с помощью этого языка вы можете определить, есть ли в конце URL точки, например:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9\-\/.]+)$ index.php/$1 [QSA,L]
</IfModule>
это RewriteRule
генерирует переменную $_SERVER['PATH_INFO']
и вы можете сравнить переменную с переменной $_SERVER['REQUEST_URI']
оба будут разными. Или вы можете просто использовать REQUEST_URI
в сочетании с rtrim
проверить и сделать постоянное перенаправление, например:
<?php
$req = rtrim($_SERVER['REQUEST_URI'], '/');//Remove / of the end of URL.
if ($req !== rtrim($req, '.')) {
header('X-PHP-Response-Code: 301', true, 301);
}
Источники:
Других решений пока нет …