Войти
ПрограммированиеФорумВеб

PHP, URL Rewrite и REQUEST_URI

Страницы: 1 2 Следующая »
#0
22:55, 22 мая 2015

разрабатываю тут кой, чего
в PHP раньше особо не лез, но тут вот начал осваиваться и кое чего не пойму
захотел сделать себе красивые адреса
поначалу реализовал следующую логику
для всех запросов проверяется наличие файла в папке public
если файл есть, то переопределяем URL-адрес так что бы он на этот файл указывал
если файла нет передаем все запросы в PHP скрипт
по началу я реализовал, такой сценарий

                <rule name="Static content" patternSyntax="Wildcard" stopProcessing="true">
                    <match url="*" />
                    <conditions>
                        <add input="{APPL_PHYSICAL_PATH}public{URL}" matchType="IsFile" />
                    </conditions>
                    <action type="Rewrite" url="public{URL}" appendQueryString="false" logRewrittenUrl="true" />
                </rule>
                <rule name="All other" patternSyntax="Wildcard" stopProcessing="true">
                    <match url="*" />
                    <action type="Rewrite" url="app.php?url={URL}" logRewrittenUrl="true" />
                </rule>
т.е. реальный URL передается через параметр запроса url, но мне показалось, что это криво, потому что любой сможет передать параметр url
и его значение перезапишет, то что было передано при переопределении адреса
потом я где то в интернете увидел, что можно передавать запрос в скрипт, вот таким макаром
                    <action type="Rewrite" url="app.php{URL}" logRewrittenUrl="true" />
как бы уже лучше наверное, надо всего лишь в PHP из REQUEST_URI имя скрипта убрать
и будет реальный URL, начал эту фигню реализовывать, смотрю, а в REQUEST_URI и так нормальный URL
как бы хорошо, но где почитать про такое поведение?
или как оно хотя бы называется, что б я знал )
или это вообще не с PHP связано, а просто IIS в FastCGI передает реальный URL, а не тот который был переопределен?

#1
23:00, 22 мая 2015

Советую этот "сервер" выбросить, а взять связку php5-fpm + nginx на Юникс-Линукс системе.
Разработку можно вести или на той же системе, или в винде через общие папки с виртуалкой.

А XML-конфигурация это вообще рука-лицо, перестала считаться модной и удобной лет 10 назад.

#2
23:01, 22 мая 2015

kvakvs
да не это именно для разработки конфигурация, работать оно будет именно на том что ты говоришь
gentoo+nginx+php5-fpm

#3
23:04, 22 мая 2015

я просто не пойму одной вещицы...
если это IIS так хитро передает url
то почему если я делаю

<action type="Rewrite" url="app.php?url={URL}" logRewrittenUrl="true" />
то 'url' доходит до PHP
а если я делаю
<action type="Rewrite" url="app.php{URL}" logRewrittenUrl="true" />
то в REQUEST_URI нету app.php

...
блин перепроверил в случае

<action type="Rewrite" url="app.php?url={URL}" logRewrittenUrl="true" />
в REQUEST_URI нету app.php O_o
я короче запутался
в REQUEST_URI что вообще помещается?

#4
23:15, 22 мая 2015

http://stackoverflow.com/questions/279966/php-self-vs-path-info-v… s-request-uri
в принципе вот здесь, по крайней мере на примерах разбирается, что по чем и зачем
и оно походу все таки к PHP относится, а не к фронтэнду
ну или к CGI, я хз, но как то оно все же не очевидно и из доков не совсем понятно

#5
0:33, 23 мая 2015

Duncon
ты это все зачем написал?

#6
0:42, 23 мая 2015

Duncon
лан, псб, просто все, что ты написал, мне как бы давно было известно

#7
5:21, 23 мая 2015

Исправление происходит потому-что не валидный url.
Ты не там копаешь, тебе просто надо .htaccess файл создавать, там можно проверить все: реальный ли урл изначальный и как его отдать php
вот примерчик
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

  # Закрываем доступ к ядру сервера, далее роутер сам разберется, что показать
  RewriteRule (^config/(.*)$|^controller/(.*)$|^core/(.*)$|^lang/(.*)$|^model/(.*)$|^link_file/(.*)$) index.php?route=$1 [L]
 
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
 
  AddDefaultCharset UTF-8
  ErrorDocument 403 /error.php?e=403
  ErrorDocument 404 /error.php?e=404
  ErrorDocument 500 /error.php?e=500
</IfModule>

#8
5:35, 23 мая 2015

ой, лан походу надо прикрывать тему...
geletka
при чем тут .htaccess и зачем мне его создавать, если у меня там IIS, а не апач?

переписал конфиг на nginx
там все так замечательно выходит ) правда ни все оттестил, но все же

server {
  ...
        set $server_root "/var/www/example.com";
        root $server_root/public;
        try_files $uri @php;
        location @php {
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $server_root/app.php;
                fastcgi_pass unix:/run/php-fpm.socket;
        }
}
и все значения которые передаются в PHP можно глянуть в поставляемом factcgi_params и хотя бы все понятно почему и как
<?php
echo $_SERVER['PHP_SELF'].'<br>';
echo $_SERVER['SCRIPT_NAME'].'<br>';
echo $_SERVER['REQUEST_URI'].'<br>';
выдает
/
/
/

#9
8:47, 23 мая 2015

Смысл такой должен быть, на уровень выше, чем php надо сделать, чтобы вызывал 1 файл php и ему отдавал url какой бы он не был, а уже php решит, что дальше делать
с IIS не работал, но возможность должна быть, если еще nginx есть, то еще надо, чтобы он передавал url, а то получится 127.0.0.1 localhost везде

#10
9:32, 23 мая 2015

geletka
Я же не просил давать советы по смыслу,
вопрос темы, что попадает в REQUEST_URI после переопределения url адреса
и все, зачем все эти бессмысленные и беспощадные советы, я как бы и без них разбираюсь в проблеме
тем более еще ни одного дельного совета в теме не прозвучало

#11
12:39, 23 мая 2015

Либо ты не так объяснил все...
$_SERVER['SERVER_NAME']
$_SERVER['REQUEST_URI']
Посмотри именно оба этих значения и напиши, что выдает

Еще тут для IIS пишут такой способ, но надо смотреть

if (!isset($_SERVER['REQUEST_URI']))
{
      $_SERVER['REQUEST_URI'] = substr($_SERVER['PHP_SELF'],1 );
      if (isset($_SERVER['QUERY_STRING'])) { $_SERVER['REQUEST_URI'].='?'.$_SERVER['QUERY_STRING']; }
}

#12
14:07, 23 мая 2015

Так, это все фигня, тебе нужен программный роутинг по-хорошему, это решит кучу проблем, обычно достаточно такого:
Создай себе какой-нибудь каталог public и держи точку входа там, а весь остальной код держи рядом, но не в public

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
# The following rewrites all other queries to index.php. The 
# condition ensures that if you are using Apache aliases to do
# mass virtual hosting, the base path will be prepended to 
# allow proper resolution of the index.php file; it will work
# in non-aliased environments as well, providing a safe, one-size 
# fits all solution.
RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]

и в настройках виртуального хоста пропиши, что public у тебя есть корень сайта

#13
17:02, 23 мая 2015

вы вот когда эти конфиги для mod_rewrite мне показываете, вы понимаете что там вообще написано?
вот какой смысл  в этих строчках?

RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]

#14
21:22, 23 мая 2015

Duncon
понимаешь, на вопрос "что попадает в REQUEST_URI?"
я не хочу услышать ваши предположения о том как надо писать конфиги, для апачевского mod_rewrite
тем более, что ни один из вас не может объяснить с ходу, что делает каждая строчка в вашем конфиги и зачем вы написали именно ее.
Есть спецификация CGI которая определяет, что в SERVER_NAME попадает хост, т.е. имя или адрес сервера к которому происходит обращение
в SCRIPT_NAME попадает URL путь
в QUERY_STRING попадает строка запроса
это все описано в спецификации и все в принципе понятно,
но REQUEST_URI не является частью спецификации, и меня интересовало, что туда попадает,
и как на значение REQUEST_URI влияет переопределение URL реализованое в URL Rewrite 2.0 в IIS 7.5
ответ на вопрос, в виде разобранных вариантов, я нашел сам и указал на него в посте #4,
но там разбирают варианты с точки зрения PHP, а не с точки зрения переопределения URL
в оффициальной документации есть простенькое описание

'REQUEST_URI'
    URI, который был передан для того, чтобы получить доступ к этой странице. Например, '/index.html'.

но он опять же рассматривает значение с точки зрения PHP ни как не беря во внимание переопределение URL-адреса
анализируя, конфиги nginx я понял, что содержимое REQUEST_URI четко определено в конфигах
fastcgi_param REQUEST_URI $request_uri;
$request_uri
    первоначальный URI запроса целиком (с аргументами)

можно предположить, что IIS ведет себя так же, и тогда конфиг IIS можно несколько упростить,
но так же встает закономерный вопрос, как получить URL уже после его переопределения?
но я боюсь задавать этот вопрос тут, потому что вы начнете рассказывать, о том как надо писать конфиги для апаческого mod_rewrite
такие дела
Страницы: 1 2 Следующая »
ПрограммированиеФорумВеб

Тема в архиве.