1. PHP / Говнокод #12261

    +53

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    $this->_requestUri = 0 === strpos($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME'])
                ? substr(
                    $_SERVER['REQUEST_URI'], strlen($_SERVER['SCRIPT_NAME'])
                )
                : $_SERVER['REQUEST_URI'];

    Запостил: __proto__, 08 Декабря 2012

    Комментарии (15) RSS

    • php
      Ответить
    • А разве REQUEST_URI может начинаться не так, как SCRIPT_NAME?
      Ответить
      • index.php обычно можно опустить, т.е. оно может присутствовать а может и нет.
        Ответить
        • Спасибо, т.е. код работает как-то так?
          "/test/index.php?a=2", "/test/index.php" => "/test/index.php"
          "/?a=3", "/index.php" => "/?a=3"

          Не пойму его смысл...
          Ответить
          • "/test/index.php?a=2", "/test/index.php" => "?a=2"
            в первом вариванте. Второй аргумент у substr - начало. Только тут наверное урлы типа index.php/some/args, т.к. в обычном виде через "?" эти аргументы можно было бы вытащить из $_SERVER['QUERY_STRING']... Правда, у автора переменная как-то не так называется...
            Ответить
            • Тест:
              echo 'REQUEST_URI = ' . $_SERVER['REQUEST_URI'];
              echo ', SCRIPT_NAME = ' . $_SERVER['SCRIPT_NAME'];

              Результаты
              Вход: /
              Выход: REQUEST_URI = /, SCRIPT_NAME = /index.php

              Вход: /index.php
              Выход: REQUEST_URI = /index.php, SCRIPT_NAME = /index.php

              Вход: /?a=2
              Выход: REQUEST_URI = /?a=2, SCRIPT_NAME = /index.php

              Вход: /index.php?a=2
              Выход: REQUEST_URI = /index.php?a=2, SCRIPT_NAME = /index.php

              Вход: index.php/some/args
              Выход: REQUEST_URI = /index.php/some/args, SCRIPT_NAME = /index.php

              Резюме: в $_SERVER['REQUEST_URI'] всегда лежит исходный запрос (ВНЕЗАПНО!), а в $_SERVER['SCRIPT_NAME'] — адрес скрипта, принявшего этот запрос (тоже внезапно).
              Ответить
        • Чуть не забыл. В Апаче с настройками по умолчанию суффикс «.php» тоже можно опустить. Т. е. /, /index.php и /index будут обрабатываться одним скриптом. Код, опубликованный __proto__, этот случай не учитывает.
          Ответить
          • В апаче вообще работа с расширениями славилась своей причудливостью.
            Ответить
            • Лень сейчас гуглить, но давно читал рекомендации по проектированию сайтов. Автор предлагал расширения опускать всегда, кроме случаев, когда они необходимы для разрешения неоднозначностей. В качестве аргумента приводил, что тогда можно будет менять язык скриптов или формат графики без смены URI.

              То есть кому-то такая причудливость даже нравится.
              Ответить
              • И любителям заливки шеллов, ага.
                Ответить
                • Возможность заливки шелла зависит не столько от обработки расширений, сколько от интерпретации скриптов из директории аплоада. Просто не надо скрипты и статику в одну директорию сваливать.
                  Ответить
      • mod_rewrite
        Ответить
      • Легко. В Zend Framework всегда SCRIPT_NAME = /index.php, а REQUEST_URI может содержать произвольную (в некоторых рамках) строку.
        Ответить

    Добавить комментарий