Подтвердить что ты не робот

Удалите 'index.php' из URL с .htaccess

Я пробовал всевозможные решения с этого сайта, и ни один из них не работает. В настоящее время у меня хостинг-хостинг. Это мой текущий файл .htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>
<IfModule mod_suphp.c>
    suPHP_ConfigPath /home/user/php.ini
    <Files php.ini>
        order allow,deny
        deny from all

    </Files>
</IfModule>

Это находится в корневой папке моего сайта. Я также попытался добавить ? после index.php и не повезло. Кто-нибудь знает, почему это не работает?

4b9b3361

Ответ 1

Это код, который вы можете использовать в своем .htaccess(под DOCUMENT_ROOT), чтобы удалить index.php из URI:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L,QSA]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)/index\.php [NC]
RewriteRule ^ %1 [R=301,L]

Ответ 2

Symfony 2 имеет отличное решение:

RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]

# Sets the HTTP_AUTHORIZATION header removed by apache
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]


RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .? - [L]

RewriteRule .? %{ENV:BASE}/index.php [L]

Это выполняет следующее:

  • RewriteBase не требуется (полезно, когда сайт находится в подкаталоге под корнем сети)
  • index.php удаляется, если присутствует
  • Запрос направляется к правильному index.php с полной строкой запроса из исходного запроса

Обратите внимание, что строка:

RewriteRule ^(.*) - [E=BASE:%1]

отвечает за настройку переменной %{ENV:BASE} для дальнейшего использования. См. Документация Apache на флаге E|env.

Ответ 3

Обновленный ответ

В эти дни я просто использую Wordpress .htaccess в качестве базы: он относительно прост и работает как ожидалось:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Также легко заставить https://, если хотите:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST} [L,R=301]

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Оригинальная публикация с 2012 года

Мое первоначальное предложение состояло в том, чтобы сначала выполнить жесткую переадресацию (разбить index.php), а затем внутреннее перенаправление обратно на index.php.

Проблема заключается в том, что жадное внутреннее сопоставление переадресации (например, с использованием (.*)), похоже, снова вызывает жесткое перенаправление, что приводит к бесконечному циклу перенаправления.

Я чувствую, что есть более элегантное решение, чем то, что я собираюсь предложить, но, к сожалению, у меня нет ноу-хау Apache, чтобы думать об этом.

Что бы я сделал, это иметь RewriteRule, который выполняет жесткую переадресацию, чтобы вырезать index.php, а затем набор внутренних правил переадресации, чтобы их оттуда оттуда. Например:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^index\.php(.*)$ /$1 [R,L,QSA]
RewriteRule ^pie$ /index.php?pie [L,QSA]
</IfModule>

Кажется, что это работает правильно, не производя никаких 500 ошибок. Но опять же, я рекомендую щепотку соли.

Хотя это далеко от хорошего решения, я надеюсь, что это поможет.

Ответ 4

Я пробовал это и прекрасно работал:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # Removes index.php from ExpressionEngine URLs
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
    RewriteCond %{REQUEST_URI} !/system/.* [NC]
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

    # Directs all EE web requests through the site index file
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>

Исключения

Если системный каталог сайтов (/system/) был переименован и по-прежнему доступен по URL-адресу, измените строку RewriteCond выше:

RewriteCond %{REQUEST_URI} !/newdirectoryname/.* [NC]

Если вы запускаете EE из подкаталога, а не из корня вашего домена (например, http://example.com/myeesite/ вместо http://example.com/), просто удалите косую черту, предшествующую index.php, в строке RewriteRule выше, например:

RewriteRule ^(.*)$ index.php/$1 [L]

Если вы запускаете EE из подкаталога и он по-прежнему не работает после удаления косой черты, вам может потребоваться указать подкаталог в вашем правиле перезаписи. Например, если ваша подпапка названа тестом, измените:

RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

To:

RewriteRule (.*?)index\.php/*(.*) testing/$1$2 [R=301,NE,L]

И измените:

RewriteRule ^(.*)$ /index.php/$1 [L]

To:

RewriteRule ^(.*)$ testing/index.php/$1 [L]

If your host requires forcing query strings, try adding a question mark following index.php in the RewriteRule line above, like so:

RewriteRule ^(.*)$ /index.php?/$1 [L]

Ответ 5

Я был вынужден присоединиться к стеку overflow.com сегодня, чтобы прокомментировать здесь, поскольку ответ решил долгосрочную проблему, с которой я столкнулся с веб-сайтом Zend Framework. Я работал на веб-сайте около 3 1/2 лет, и за это время я обнаружил, что он не обрабатывает index.php правильно, и это приводит к тому, что инструменты для веб-мастеров видят дубликаты названий и т.д.

Я решил снова найти сегодня решение, которое много раз пыталось сделать.

Это один (последний ответ, показанный выше), который решает мою проблему.

    # Removes index.php from ExpressionEngine URLs
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
    RewriteCond %{REQUEST_URI} !/system/.* [NC]
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

В качестве примера. это то, что он достигает для меня.

http://www.domainname.co.uk/index.php/categories/url-name.html

становится

http://www.domainname.co.uk/categories/url-name.html

Спасибо всем, кто внес свой вклад в исходный вопрос, поскольку это приводит к ответу и решению выше.

Дополнительное примечание. У меня есть другие команды перезаписи, которые обрабатывают другие аспекты, но сами по себе не исправили index.php, и единственный раз, когда это было исправлено, используется.

# Removes index.php from ExpressionEngine URLs
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteCond %{REQUEST_URI} !/system/.* [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

Я только надеюсь, что это поможет другим, будь то ExpressionEngine или Zend Framework, в будущем.

Ответ 6

Чтобы удалить index.php из URL-адресов на apache2.4, вы можете использовать следующее правило:

 RewriteEngine on

 RewriteRule ^index\.php/(.+)$ /$1 [L,R]
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule !index\.php /index.php%{REQUEST_URI} [L,END]

Это изменит uri

/index.php/foobar

к

/foobar

Это правило вернет внутреннюю ошибку сервера для более низких версий apache, поскольку они не поддерживают флаг END. Пожалуйста, см. Ответ anubhava выше, который работает почти во всех версиях.