it-swarm.com.ru

Удалите "index.php" из URL с помощью .htaccess

Я пробовал всевозможные решения с этого сайта, но ни одно из них не работает. В настоящее время я хостинг с hostgator. Это мой текущий файл .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 и не повезло. Кто-нибудь знает, почему это не работает?

13
Norse

Этот код вы можете использовать в вашем .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]
50
anubhava

У 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 .

4
Frédéric Klee

Я попробовал это и работает нормально:

<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 из подкаталога, и он не работает после удаления косой черты, вам может потребоваться указать подкаталог в правиле перезаписи. Например, если ваша подпапка называется «test», измените:

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

Для того, чтобы:

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

И Правка:

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

Для того, чтобы:

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]
1
stampgo

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

В эти дни я просто использую 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 ошибок. Но опять же, я рекомендую щепотку соли.

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

1
afeique

Чтобы удалить 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. Пожалуйста, смотрите ответ анубхавы выше, который работает почти на всех версиях.

0
starkeen

Я был вынужден присоединиться к стеку overflow.com сегодня, чтобы прокомментировать, поскольку ответ решил долгосрочную проблему, с которой я столкнулся на веб-сайте Zend Framework. Я работал над сайтом около трех с половиной лет, и за это время обнаружил, что он неправильно обрабатывает 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, в будущем.

0
Paul