Почему бы не использовать точку (& quot;. & Quot;) при перезаписи URL?

Я заметил, что большинство маршрутов PHP-фреймворков (все) не используют записанную точку URL и PHP-автономный-сервер также не использует точки (обратите внимание, что PHP-автономный-сервер не нужно mod_rewrite, обычно это работает). Это шаблон, я избегаю точек переписанных URL-адресов?

Попробуйте прочитать следующие темы:

  1. Если я бегу 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,

  2. Собственный стековый поток является примером, который заменяет точки дефисами, например, этот вопрос:

    • Заглавие: Why not use the dot (“.”) in url rewrite?
    • Адрес: http://stackoverflow.com/questions/29977809/why-not-use-the-dot-in-url-rewrite
  3. Примером фреймворка php является CodeIgniter-3, это не разрешать точки.

Вопрос:

Понимаю это, мне интересно, должен ли я разрешить точки («.») В или нет? Не использовать точки это «стандарт»?

0

Решение

Наконец нашел причину этой «полемики», когда я искал (гуглил) термин Точка пути 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) — это процесс, с помощью которого URL изменяются и стандартизируются согласованным образом. Целью процесса стандартизации является превращение URL в standard URL или канонический, чтобы вы могли определить, могут ли два разных URL быть синтаксически эквивалентными.

Поисковые системы используют URL-адрес стандартизации для придания важности веб-страницам и сокращения индексации дублированных страниц. Сканеры выполняют нормализацию URL, чтобы избежать отслеживания одного и того же ресурса более одного раза.

Типы стандартизации (следующая нормализация описывается RFC 3986):

  • Удаление индекса каталога. Индексы каталога по умолчанию обычно не требуются в URL:

    http://www.example.com/a/index.htmlhttp://www.example.com/a/

  • Замена IP доменного имени. Убедитесь, что IP-адрес соответствует каноническому имени домена:

    http://208.77.188.166/http://www.example.com/ (то, что помогает это заголовок Host: domain)

  • Удаление повторяющихся путей резки, которые включают в себя две соседние полосы, можно преобразовать в:

    http://www.example.com/foo//bar.htmlhttp://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/alicehttp://www.example.com/alice/ (обычно сервер с Apache и Nginx уже выполняет перенаправление, если это настоящая папка).

    Однако нет способа узнать, является ли компонент пути URL каталогом или нет. RFC 3986 обратите внимание, что если URL перенаправляет на предыдущий пример URL, это указывает на то, что они эквивалентны.

  • Удаление сегментов точек (dot-сегментов). Сегмент .. а также . Его можно удалить из URL в соответствии с алгоритмом, описанным в RFC 3986:

    http://www.example.com/../a/b/../c/./d.htmlhttp://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);
}

Источники:

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]