Как сделать переписывание URL .htaccess, чтобы включить index.php в URL?

0

У меня есть 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, и получил следующие результаты:

  • для адреса: http://example.com/ojs/ (по желанию) переписывание URL не выполняется, так как я не вижу содержимое index2.php
  • для адреса: http://example.com/ojs/anything Я вижу содержимое 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.

Большое спасибо,

Теги:
.htaccess
mod-rewrite
url-rewriting

2 ответа

0

Честно говоря, я подозреваю, что система OJS читает REQUEST_URI и ожидает, что она будет иметь форму /ojs/index.php/foo. Вместо этого он получает /ojs/foo, и поскольку он не распознает это, отображается главная страница.

Думаю, вам нужно сообщить (или изменить) OJS, чтобы ожидать /ojs/foo.

Чтобы просто проверить, что Apache не возится, добавьте флаг R=301 для тестирования. Если я прав, вы должны перенаправить на /ojs/index.php/foo - и когда браузер последует за этим перенаправлением, он будет работать. Конечно, это субоптимально, поэтому следует придерживаться ожиданий OJS. :)

(Кстати, здесь нет необходимости в QSA.)

  • 0
    Спасибо @ Сидекин. Я проверю это. Просто вопрос: не в этом ли смысл перезаписи URL с помощью .htaccess, что когда сервер запрашивает адрес example.com/ojs/foo, сервер Apache сначала преобразует его в example.com/ojs/index.php/ фу, а затем обрабатывает его. Если Apache делает это правильно, то OJS не должен получать / ojs / foo, но он должен получить /ojs/index.php/foo. Я что-то пропустил?
  • 0
    @ cybergeek654 REQUEST_URI содержит компонент пути исходного (предварительно переписанного) запрошенного URI; переписывание оставляет это в покое. Переписывание в первую очередь изменяет то, что на самом деле заканчивается обслуживанием; в этом случае index.php. Это также изменяет PATH_INFO в вашем случае, и это может дополнительно изменить другие вещи, кроме. (Я не знаю OJS, но я подозреваю, что он использует REQUEST_URI , и я не удивлюсь, если он полностью игнорирует PATH_INFO , и в этом случае просто перенаправление на index.php (без / $ 1 PATH_INFO ) будет работать так же.)
Показать ещё 6 комментариев
0

Я думаю, что это похоже на 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]
  • 0
    Спасибо за ответ. Я пытался. но все равно это не работает.
  • 0
    Привет, Вам нужно дать разрешение на чтение и права на файл .htaccess.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню