Маскировка путей

Главные вкладки

Аватар пользователя Ильич Рамирес Санчес Ильич Рамирес Санчес 4 августа 2008 в 19:30

Добавляем в settings.php функцию вида:
<?php
function custom_url_rewrite($op, $result, $path) {
global $user;
if ($op == 'alias') {
if($result != $path) return $result; // there was result already
// Overwrite a menu path already defined, with this code, if the user
// goes to 'tracker', the page 'views/tracker' will be displayed instead
// without any redirection. To achieve this, only the op source act is a
// must, this is optional.
if ($path == 'views/tracker') {
return 'tracker';
}
// Change all 'node' to 'article'.
if (preg_match('|^node/(.*)|', $path, $matches)) {
return 'article/'. $matches[1] . '.html';
}
// Create a path called 'e' which lands the user on her edit page.
if ($path == 'user/'. $user->uid .'/edit') {
return 'e';
}
}
if ($op == 'source') {
if ($path == 'tracker') {
// Change 'tracker' to 'views/tracker' when a request lands.
return 'views/tracker';
}
// Change all 'node' to 'article'.
if (preg_match('|^article(/.*).html|', $path, $matches)) {
return 'node'. $matches[1];
}
// Create a path called 'e' which lands the user on her edit page.
if ($path == 'e') {
return 'user/'. $user->uid .'/edit';
}
}
// Do not forget to return $result!
return $result;
}
?>

и имeем пути не вида node/xxx а вида article/xxx.html

Smile
кому то будет удобно.

Комментарии

Аватар пользователя Ромка Ромка 4 августа 2008 в 20:57

Nikit wrote:
один путь к сокрытию движка закрыт
осталось закрыть стандартные user :)

Дык, с помощью этой же функции и пути user можно перекрыть... А при помощи функций темизации можно изменить профиль до неузнаваимости.

Аватар пользователя VladSavitsky VladSavitsky 5 августа 2008 в 8:56

Отличное решение. Подшил в книгу.
Мне кажется, что скрыть характерные для Drupal штучки может быть полезно с точки зрения безопасности, а не для маскировки под Джумлу and etc.

Вот что ещё можно сделать в этом направлени: Скрыть версию Друпал.

Аватар пользователя sadmin sadmin 5 августа 2008 в 13:44

На индексации это не скажется?
vitalikis это вопросы безопасности. Кто-нибудь будет ломать сайт на Джумле, а окажется что это Друпал

Аватар пользователя Ильич Рамирес Санчес Ильич Рамирес Санчес 5 августа 2008 в 14:39

ну мне было по приколу чучуть изменить пути...

пример взят из доки кроме одного ифа:
if($result != $path) return $result; // there was result already

если его не добавить алиасы друпала не будут работать )

Аватар пользователя seaji seaji 6 августа 2008 в 0:10

Мне кажется здесь ошибочка закралась:
<?php
// Change all 'node' to 'article'.
if (preg_match('|^article(/.*).html|', $path, $matches)) {
return 'node'. $matches[1];
}
?>
В комментарии говорится, что node меняется на article а возврат идет node.
Или я чего не понял?

Аватар пользователя seaji seaji 6 августа 2008 в 0:16

А вообще то множественные ифы очень трудно читаются, а если еще учитывать что всегда сравнивается одна переменная $path, то логичней было бы использовать switch() case '': конструкцию
Во первых, конструкция switch() case '': вычисляется только один раз, а вот if() {} вычисляется каждый раз при вызове.
Во вторых, просто читается легче.

Аватар пользователя whisk@drupal.org whisk@drupal.org 6 августа 2008 в 13:44

Полезное решение, иногда очень нужно максимально скрыть движок сайта.
Только я бы preg_match переписал бы на substr — должно быстрее работать, а функция вызывается очень часто. Кто-нибудь скорость проверял профайлером?

Аватар пользователя Ильич Рамирес Санчес Ильич Рамирес Санчес 6 августа 2008 в 14:13

Quote:
ab -c 4 -t 120 http://localhost/remstroy/article/25.html
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Finished 17890 requests

Server Software: Apache/2.2.8
Server Hostname: localhost
Server Port: 80

Document Path: /remstroy/article/25.html
Document Length: 6625 bytes

Concurrency Level: 4
Time taken for tests: 120.6175 seconds
Complete requests: 17890
Failed requests: 0
Write errors: 0
Total transferred: 127713096 bytes
HTML transferred: 118534500 bytes
Requests per second: 149.08 [#/sec] (mean)
Time per request: 26.832 [ms] (mean)
Time per request: 6.708 [ms] (mean, across all concurrent requests)
Transfer rate: 1039.27 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.7 0 48
Processing: 5 26 13.6 24 116
Waiting: 0 19 12.0 18 115
Total: 5 26 13.6 24 116

Percentage of the requests served within a certain time (ms)
50% 24
66% 28
75% 31
80% 34
90% 43
95% 53
98% 67
99% 75
100% 116 (longest request)

на ноуте, который верой и правдой служит 2 года

Аватар пользователя Paldru Paldru 20 августа 2009 в 0:53

"axel" wrote:
custom_url_rewrite_inbound() - для преобразования входящих запросов
custom_url_rewrite_outbound() - для представления путей в строке броузера

То что нужно. А можно как-нибудь сделать чтобы при прямом просмотре node/$ выдавало ошибку 404, но замена article/$ при этом работала?

Аватар пользователя alekseykhrebtov alekseykhrebtov 27 октября 2009 в 1:07

"axel" wrote:
custom_url_rewrite_outbound() - для представления путей в строке броузера

С помощью данного метода можно site.ru/node/55 преобразовать в site.ru/55 ?