Справка по перезаписи URL - PullRequest
1 голос
/ 09 июля 2009

Спасибо всем за ваше терпение и помощь. Я полностью перезагружаю вопрос, потому что он становится довольно длинным после всех моих пересмотров. У меня есть PHP MVC Framework с 4 точками входа:

от корня:
index.php
index-ajax.php
admin / index.php
админ / индекс-ajax.php

Мне нужен файл .htcaccess, который будет принимать любой запрос и переписывать его в соответствующий файл на основе URL. Длинный URL был бы index.php? Rt = cms / view / 15, и я хотел, чтобы это был index / cms / view / 15. Эта часть в значительной степени сделана за исключением одного гоча.

Вот мой файл .htaccess сейчас:

# htaccess file for framework - GOOD
Options +FollowSymLinks

# Turn on the mod_rewrite engine - GOOD
RewriteEngine On

# Hide indexes - GOOD
Options -Indexes

# If a file is not one of these, continue processing. - GOOD
RewriteRule \.(css|js|jpg|jpeg|png|gif|ico)$ - [L]

# RewriteRules for folder index files
#RewriteRule ^(index)?(.php)?$ index.php [L] - GOOD
#RewriteRule ^admin(/?)(index)?(.php)?$ admin/index.php [L] - GOOD

# RewriteRules for admin folder arguements - going from more specific to less
RewriteRule ^admin/ajax/[A-Za-z0-9-_/]*$ admin/index-ajax.php?rt=$1 [L]
RewriteRule ^admin/[A-Za-z0-9-_/]*$ admin/index.php?rt=$1 [L]

# RewriteRule for root ajax file
RewriteRule ^ajax/[A-Za-z0-9-_/]*$ index-ajax.php?rt=$1 [L]

# RewriteRule for root file - by here, it is not ajax or admin related, so only
# possible option left if the root index file
RewriteRule ^[A-Za-z0-9-_/]*$ index.php?rt=$1 [L]

Я сделал простой сайт с двумя папками - 'root' и 'root / admin', и внутри каждой из них папки css, images и javascript с некоторым фиктивным контентом. Внутри файлов 'root' и 'root / admin' есть файлы index.php и index-ajax.php, которые просто выводят любой аргумент url и используют файлы css, js и image из каждой папки.

Проблема, с которой я столкнулся сейчас, заключается в том, что если я делаю URL-адрес, такой как index / blah или / admin / index / blah, то страница отображается правильно, а аргумент - правильным. Однако, когда я делаю URL-адрес, такой как index / blah / view или admin / index / blah / view, тогда аргумент верен (? Rt = blah / view), но страница отображается неправильно, потому что файл css / js / images идет в индекс / Blah / [CSS] вместо индекса / [CSS].

Есть идеи, как с этим справиться? Я позволил файлам css / js / image проходить, как есть, через .htaccess, чтобы там было меньше работы.

Ответы [ 7 ]

9 голосов
/ 09 июля 2009

Вы уверены, что все должно обрабатываться index.php? А как насчет статических файлов, таких как images / css и т. Д.?

Вот альтернативный метод, который может вас заинтересовать. Вы можете переслать любой URL, который еще не существует в виде файла или каталога, в ваш файл index.php, а затем проанализировать URL-адрес там, например. [domain.com] / cms / view / 15 будет переписано в [domain.com] /index.php/cms/view/15. Для этой работы вам нужно установить для директивы apache AcceptPathInfo значение On.

.htaccess:

RewriteEngine On
#check url is not a valid file
RewriteCond %{REQUEST_FILENAME} !-f
#check url is not a valid directory
RewriteCond %{REQUEST_FILENAME} !-d
#rewite anything left
RewriteRule ^(.*)$ index.php/$1 [L]

index.php

$path = trim($_SERVER['PATH_INFO'], '/');
$pathParts = explode('/', $path);

if (isset($pathParts[0])) {
    $com = $pathParts[0];
} else {
    $com = 'defaultcom';
}

//$com[1] will be 'view' if supplied
//$com[2] will be 15 if supplied

Мне нравится этот подход, потому что вы не обязаны определять и понимать URL в конфигурации apache, но вы можете выполнять большую часть работы в PHP.

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

Вместо этого вы можете использовать это как ваш .htaccess, это перенаправит любой запрос с расширением, отсутствующим в списке, в ваш скрипт PHP. RewriteCond должен остановить переписывание запросов к папке администратора.

RewriteEngine On
#don't rewrite admin
RewriteCond %{REQUEST_URI} ^admin/
#rewrite anything with a file extension not in the list
RewriteRule !\.(js|gif|jpg|png|css|ico)$ /index.php [L]
3 голосов
/ 09 августа 2009

Если я не пропустил суть вашего вопроса (я задаю вопрос после редактирования вашего вопроса), звучит так, как будто вам нужно исправить относительные пути image / css для URL, которые имеют много папок. Простое решение, не используйте относительные пути изображения! Просто начните ваши изображения / CSS ссылки с косой черты ..

<img src="/img/logo.png" alt="something" />

Я всегда считал, что это более простой подход, когда у вас есть один шаблон для многих страниц с непредсказуемой глубиной папок. Если у вас есть тестовый URL для локальной разработки, он отлично работает для локальных и производственных серверов.

3 голосов
/ 09 июля 2009

Я бы сделал это , как сказал Том Хей , и проанализировал бы запрошенный путь URL с помощью PHP:

// extract the URL path
$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
// extract the path segments
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/'));
// expected parameters and its default values
$params = array(
    'com'    => 'default',
    'action' => 'default',
    'val'    => 'default'
);
foreach ($params as $key => $val) {
    if (isset($segments[0])) {
        $_GET[rawurldecode($key)] = rawurldecode(array_shift($segments));
    } else {
        break;
    }
}
$restOfTheURLPath = implode('/', $segments);
var_dump($_GET);

И правила для mod_rewrite:

# redirect every request, that cannot be mapped to an existing file, to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin(/|$) admin/index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

Редактировать В ответ на ваш комментарий и теперь отредактированный вопрос: Вы можете исключить нужные каталоги с помощью правила впереди, которое завершает процесс перезаписи:

RewriteRule ^(css|images)/ - [L]
RewriteRule ^admin/index\.php$ - [L]
RewriteRule !^index\.php$ index.php [L]
2 голосов
/ 09 июля 2009

Ну, это выглядит довольно хорошо, за исключением тех $, которые вы положили в середину, вроде бы испортили его; $ обозначает конец регулярного выражения, поэтому я не думаю, что он будет работать правильно.

Кроме того, я думаю, что вам, возможно, придется убежать от косой черты, но я не уверен.

1 голос
/ 09 августа 2009
# htaccess file for framework - GOOD
Options +FollowSymLinks

# Turn on the mod_rewrite engine - GOOD
RewriteEngine On

# Hide indexes - GOOD
Options -Indexes

# If a file is not one of these, continue processing. - GOOD
RewriteRule ^images/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ - 
RewriteRule ^images/admin/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ - 
RewriteRule ^admin/(([A-Za-z0-9\-_/]*)/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ admin/images/$3.$4 [L]
RewriteRule ^(([A-Za-z0-9\-_/]*)/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ images/$3.$4 [L]

# RewriteRules for folder index files
#RewriteRule ^(index)?(.php)?$ index.php [L] - GOOD
#RewriteRule ^admin(/?)(index)?(.php)?$ admin/index.php [L] - GOOD

# RewriteRules for admin folder arguements - going from more specific to less
RewriteRule ^admin/ajax/([A-Za-z0-9\-_/]*)$ admin/index-ajax.php?rt=$1 [L]
RewriteRule ^admin/([A-Za-z0-9\-_/]*)$ admin/index.php?rt=$1 [L]

# RewriteRule for root ajax file
RewriteRule ^ajax/([A-Za-z0-9\-_/]*)$ index-ajax.php?rt=$1 [L]

# RewriteRule for root file - by here, it is not ajax or admin related, so only
# possible option left if the root index file
RewriteRule ^([A-Za-z0-9\-_/]*)$ index.php?rt=$1 [L]

Приведенный выше .htaccess работает при тестировании с вашим каталогом и настройкой файлов на сервере Linux / apache

Я заменил вам строку ignore-images перезаписью, которая отправляет запрос на изображение в / ajax / hello / world / images в / images и, если оно находится в папке администратора, оно перейдет в / admin / images

0 голосов
/ 06 августа 2009

Итак, images / css / etc ломаются, потому что вы используете относительный URL в HTML, и теперь, когда вы переходите во вложенность, они ломаются? С некоторыми другими установками MVC, с которыми я столкнулся, обычно есть какая-то переменная «корневой путь», устанавливаемая контроллером на основе URL-адреса запроса и используемая компонентом View для добавления префиксов ко всем путям к ресурсам, таким как images / styles / scripts. 1001 *

Это превращает вашу проблему .htaccess в проблему Controller / PHP, которая, если это приемлемое для вас решение, будет включать в себя то, что ваш Controller будет делать что-то вроде взрыва URL-адреса запроса на "/", подсчета количества получаемых частей и построение относительного URL из результата.

Я сделал то же самое для пользовательской установки MVC; проверьте http://avogadro.ws/hosted/skel/public/results/school-1 и посмотрите на исходный код головы для местоположений CSS. CSS для этой страницы фактически находится на уровне http://avogadro.ws/hosted/skel/, который Контроллер встраивает в относительную строку.

0 голосов
/ 09 июля 2009

Последняя строка, вероятно, должна быть:

RewriteRule ^/([A-Za-z\-_]+)/([A-Za-z\-_]+)/([A-Za-z0-9\-_]+)$ /index.php?com=$1&action=$2&val=$3 [L,R]
...