REQUEST_URI не переопределяется при использовании APACHE RewriteRule? - PullRequest
10 голосов
/ 03 мая 2011

Проблема:

Я использую Kohana / PHP для разработки веб-сайта для других компаний.Я заставляю клиента добавить запись CNAME на свой DNS-сервер, чтобы указать мой домен.Например.http://invites.somecompany.com указывает на http://www.mydomain.com.

Таким образом, запись % {HTTP_HOST} на моем сервере Apache называется 'invites.somecompany.com'

Я хочу переписать http://invites.somecompany.com/invite в http://www.mydomain.com/invites/invite

Несмотря на то, что Apache, кажется, делает это, $ _SERVER ['REQUEST_URI'] по-прежнему "/".Проблема в том, что Kohana использует $ _ SERVER ['REQUEST_URI'] для направления запроса к соответствующему коду контроллера.В этом случае он направляет его на контроллер индекса base вместо контроллера invites .

Факты:

Директивы Apache mod_rewrite, которые я использую (в файле .htaccess): -

RewriteCond %{HTTP_HOST} !^www.mydomain.com$
RewriteCond %{REQUEST_URI} !.*invites.*
RewriteRule ^(.*)$ invites/$1

# For Kohana
RewriteRule .* index.php?kohana_uri=$0 [PT,QSA,L]

в index.php, я делаю:

var_dump($_SERVER);

и я получаю:

'REQUEST_URI' => string '/',
'QUERY_STRING' => string 'kohana_uri=invites/index.php&kohana_uri=invites/invite'
'REDIRECT_QUERY_STRING' => string 'kohana_uri=invites/invite'

То есть mod_rewrite не изменяет REQUEST_URI?

Нужно:

'REQUEST_URI' => 'invites/invite',
'QUERY_STRING' => string 'kohana_uri=invites/invite',

Как мне это получить?

====================== Редактировать

Переписать записи в журнале: -

strip per-dir prefix: /Users/project/invite -> invite
 applying pattern '^(?:application|modules|system)\b.*' to uri 'invite'
 strip per-dir prefix: /Users/project/invite -> invite
 applying pattern '\.git' to uri 'invite'
 strip per-dir prefix: /Users/project/invite -> invite
 applying pattern '^(.*)$' to uri 'invite'
 rewrite invite -> invites/invite
 add per-dir prefix: invites/invite -> /Users/project/invites/invite
 strip per-dir prefix: /Users/project/invites/invite -> invites/invite
 applying pattern '.*' to uri 'invites/invite'
 rewrite invites/invite -> index.php?kohana_uri=invites/invite
 add per-dir prefix: index.php -> /Users/project/index.php
 strip document_root prefix: /Users/project/index.php -> /index.php
 internal redirect with /index.php [INTERNAL REDIRECT]
 strip per-dir prefix: /Users/project/index.php -> index.php
 applying pattern '^(?:application|modules|system)\b.*' to uri 'index.php'
 strip per-dir prefix: /Users/project/index.php -> index.php
 applying pattern '\.git' to uri 'index.php'
 strip per-dir prefix: /Users/project/index.php -> index.php
 applying pattern '^(.*)$' to uri 'index.php'
 rewrite index.php -> invites/index.php
 add per-dir prefix: invites/index.php -> /Users/project/invites/index.php
 strip per-dir prefix: /Users/project/invites/index.php -> invites/index.php
 applying pattern '.*' to uri 'invites/index.php'
 rewrite invites/index.php -> index.php?kohana_uri=invites/index.php
 add per-dir prefix: index.php -> /Users/project/index.php
 initial URL equal rewritten URL: /Users/project/index.php [IGNORING REWRITE]

Ответы [ 3 ]

1 голос
/ 03 мая 2011

1.) Работает ли эта ссылка, если вы вызываете ее вручную?http://www.mydomain.com/invites/invite

2.) RewriteCond %{HTTP_HOST} !^www.mydomain.com$ необходимо экранировать, как RewriteCond %{HTTP_HOST} !^www\.mydomain\.com$

3.) RewriteRule .* index.php?kohana_uri=$0 [PT,QSA,L] - это бесконечный цикл, так как index.php соответствует регулярному выражению .*тоже.

4.) Вам нужен флаг R, чтобы перенаправить пользователя на приглашение / RewriteRule ^(.*)$ invites/$1 [R=301].%{REQUEST_URI} - это то же самое URI, что и в адресной строке браузера.

5.) Если вы не хотите перенаправлять посетителя, вы можете «взломать» систему кохана и установить $_SERVER['REQUEST_URI'] = $_GET['myURI']; в первомстрока index.php, если это будет единственная возможность запустить его.myURI можно заполнить через mod_rewrite, как вы пожелаете.

0 голосов
/ 20 мая 2011

Из-за того, как работает mod_rewrite, его нельзя сразу ввести в $_SERVER['REQUEST_URI']. Если вы счастливы изменить $_SERVER (что иногда считается плохой идеей), как насчет чего-то вроде этого:

$_SERVER['REQUEST_URI'] = $_GET['kohana_uri'];
$_SERVER['QUERY_STRING'] = $_SERVER['REDIRECT_QUERY_STRING'];
0 голосов
/ 03 мая 2011

Удален мой предыдущий ответ, так как он был неверным.Спасибо за ссылку документации, узнал что-то новое.

Снимите флаг QSA:

# For Kohana
RewriteRule .* index.php?kohana_uri=$0 [PT,L]

В соответствии с Документами :

'qsappend | QSA '(добавление строки запроса) Этот флаг заставляет механизм перезаписи добавлять часть строки запроса строки подстановки к существующей строке вместо ее замены.Используйте это, если вы хотите добавить больше данных в строку запроса с помощью правила перезаписи.

Должен был заметить, что в первый раз.

...