2014-07-02 2 views
0

Здравствуйте, у меня есть «защищенная» папка на моем сервере. В своем файле .htaccess для условной переадресации некоторых пользователей я использую следующие правила:Переписать URL-адрес после перенаправления в папку - htaccess laravel

RewriteCond %{REMOTE_ADDR} ^1\.2\.3\.4* 
RewriteCond %{REQUEST_URI} !^/special 
RewriteRule ^$ /special [R,NE,NC] 

В/специальной папке у меня есть файл .htaccess со следующими правилами:

RewriteCond %{REMOTE_ADDR} !^1\.2\.3\.4$ 
RewriteRule ^(.*)$/[R=301,NE,NC,L] 

Применение в папка будет основана на laravel, поэтому мой контент должен быть подан из файла index.php, находящегося в /special/laravel/public/index.php

Я хочу, чтобы URL-адрес выглядел как/special /.

Какие правила следует устанавливать и где это должно произойти?

Это является продолжением моей предыдущей вопрос:

https://stackoverflow.com/questions/24487012/redirecting-specific-ip-to-special-content-htaccess-vs-php

+0

Чтобы уточнить, хотите ли вы получить запрос на '/ special/index.php', чтобы фактически загрузить'/special/laravel/public/index.php', или я полностью отключен? – Jakar

+0

Да, это именно то, что я хочу, учитывая уже существующие правила для перенаправления. – kdobrev

+0

Хорошо. То, как я лично его обрабатываю, - это всегда мой внутренний ретранслятор '.htaccess' на'/dir/load_page.php', тогда мой 'load_page.php' обрабатывает все остальное. Если вы хотите сделать это таким образом, я могу дать вам свой «.htaccess», а затем другой материал - это несколько простой php. В противном случае я, вероятно, могу написать правила, которые вам нужно просто переписать URL-адрес внутри с помощью .htaccess, но последний менее надежный. – Jakar

ответ

0

Просто переписать URL с .htaccess: (идет в /)

DirectoryIndex index.php 

#Redirect to /special/laravel/public if you haven't already and the IP is okay 
RewriteCond %{REMOTE_ADDR} ^1\.2\.3\.4* 
RewriteCond %{REQUEST_URI} !^/special/laravel/public 
RewriteRule ^(/special)(/laravel)?(.+) /special/laravel/public$2 [L] 

#if IP does not match and you ARE in the folder, then Redirect to root 
RewriteCond %{REMOTE_ADDR} !^1\.2\.3\.4* 
RewriteCond %{REQUEST_URI} ^/special/laravel/public 
RewriteRule .?/[R=301,L] 

Я думаю, что будет работать , Я не тестировал его. Я могу добавить к нему, если понадобится. И, конечно же, для вашего случая использования вам может потребоваться добавить еще RewriteCond s для проверки REMOTE_ADDR.

Как мне справиться с этим:

.htaccess:

RewriteCond %{REQUEST_URI} !^/load_page.php$ 
RewriteRule ^(.+)$ /load_page.php [QSA, L] 

Это заставляет сервер внутренне перенаправления load_page.php, если запрашиваемый URL не load_page. Без RewriteCond я считаю, что это вызовет бесконечную перенаправление. Это должно сработать, но я не тестировал его, потому что он отличается от моей реализации, поскольку моя также обрабатывает переписывание URLS, чтобы иметь завершающие слэши и никогда не показывать .php, что делает его немного более сложным и совершенно другим.

load_page.php:

$SITE_ROOT = $_SERVER['DOCUMENT_ROOT']; 
$URL = $_SERVER['REQUEST_URI']; 

ob_start(); 
if (conditionOne){ 
    //change $URL here if you need to or do nothing 
} else if (conditionTwo){ //check the IP or whatever you want to here 
    if (aCondition){//if $URL starts with '/special' 
     $URL = str_ireplace('/special/','/special/laravel/public/',$URL,1); 
    } 
    if (is_dir($SITE_ROOT.$URL))$URL .='index.php'; 
} 
if (!file_exists($SITE_ROOT.$URL))$URL = '/error/404.php'; 
include($SITE_ROOT.$URL); 
$content = ob_get_clean(); 
echo $content; 

Это то, что влияет. Пользователь не видит load_page.php, и они не видят, что вы изменили URL-адрес на special/laravel/public, но вы включили правильный файл.

+0

Спасибо за ваш ответ, я (на более позднем этапе) определенно реализую версию PHP. Но на данный момент я все это скрутил с файлами .htaccess. Итак, как я запутался: у меня есть 3 физических папки /,/special и/special/laravel/public. Какие статусы, в которые должен храниться файл .htacces? – kdobrev

+0

Я думаю, что мне нужно использовать Alias ​​в конфигурации apache. – kdobrev

+0

Я отредактировал свой ответ. Вероятно, я бы использовал только один .htaccess, потому что лично мне это легче управлять. Если вам нужно больше, и вы говорите мне, что хотите, достаточно простым способом, как 'if (thisConditionIsTrue) {do this} else if (thisOtherConditionIsTrue) {do that}', тогда я могу попытаться написать функционирование '.htaccess'. Но, по моему опыту, большая часть трудности в htaccess возникает из-за трудности с регулярным выражением. Если это ваша проблема, ознакомьтесь с http://www.regexr.com/, иначе вам может потребоваться просто прочитать http://httpd.apache.org/docs/current/rewrite/intro.html – Jakar

Смежные вопросы