У меня есть php-based система (называемая OJS), установленная на моем хосте. Он использует SMARTY для создания страниц. У меня есть страницы с URL-адресами, такими как: http://example.com/ojs/index.php/foo
Я хочу иметь возможность набирать http://example.com/ojs/foo в адресной строке, а.htaccess будет добавлять index.php в URL-адрес и выполнять новый полный URL-адрес, чтобы index.php мог генерировать требуемую страницу.
Теперь я использую следующее в файле.htaccess в папке ojs.
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,L]
</IfModule>
Я также попробовал так много других синтаксисов и директив в.htaccess. но не работает. Когда я вхожу в http://example.com/ojs/index.php/foo в адресной строке, я получаю нужную мне страницу. Когда я вхожу в http://example.com/ojs/foo (или любую страницу, не определенную в ojs, такую как http://example.com/ojs/blahbla или http://example.com/ojs/index.php/blahblahbla) показывает главную страницу http://example.com/ojs/
Я сделал тест, и я думаю, что правило Rewrite, по крайней мере, что-то делает. Я сделал фиктивный PHP-код в файле index2.php (в папке ojs), который эхо суперглобальных значений. Для этого теста я изменил правило перезаписи, включив index2.php, и получил следующие результаты:
$_SERVER['HTTP_HOST']: example.com $_SERVER['REQUEST_URI']: /ojs/anything $_SERVER[SCRIPT_NAME]: /ojs/index2.php $_SERVER['PHP_SELF']: /ojs/index2.php $_SERVER['REQUEST_METHOD']: GET $_SERVER['PATH_INFO']: $_SERVER['ORIG_PATH_INFO']: /anything __FILE__: /home/user/public_html/ojs/index2.php
Может ли кто-нибудь подумать, почему он работает с index2.php, и он не работает с index.php?
Моя конфигурация, если это помогает:
PHP версии 5.3.29, Apache версии 2.2.29, хост: Cpanel, общий хост Linux,
У меня нет доступа к основному журналу ошибок или файлу конфигурации Apache.
Большое спасибо,
Честно говоря, я подозреваю, что система OJS читает REQUEST_URI
и ожидает, что она будет иметь форму /ojs/index.php/foo
. Вместо этого он получает /ojs/foo
, и поскольку он не распознает это, отображается главная страница.
Думаю, вам нужно сообщить (или изменить) OJS, чтобы ожидать /ojs/foo
.
Чтобы просто проверить, что Apache не возится, добавьте флаг R=301
для тестирования. Если я прав, вы должны перенаправить на /ojs/index.php/foo
- и когда браузер последует за этим перенаправлением, он будет работать. Конечно, это субоптимально, поэтому следует придерживаться ожиданий OJS. :)
(Кстати, здесь нет необходимости в QSA
.)
Я думаю, что это похоже на CodeIgniter, где мы удаляем index.php из url. Вы можете использовать ниже.htaccess код для удаления index.php из url. Вы должны добавить код ниже в корневую папку проекта.
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ index.php/$1 [L]
REQUEST_URI
содержит компонент пути исходного (предварительно переписанного) запрошенного URI; переписывание оставляет это в покое. Переписывание в первую очередь изменяет то, что на самом деле заканчивается обслуживанием; в этом случае index.php. Это также изменяетPATH_INFO
в вашем случае, и это может дополнительно изменить другие вещи, кроме. (Я не знаю OJS, но я подозреваю, что он используетREQUEST_URI
, и я не удивлюсь, если он полностью игнорируетPATH_INFO
, и в этом случае просто перенаправление на index.php (без / $ 1PATH_INFO
) будет работать так же.)