web-dev-qa-db-ja.com

.htaccessを使用してURLから「index.php」を削除します

私はこのサイトからあらゆる種類のソリューションを試してきましたが、どれもうまくいかないようです。私は現在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

これは、URIからindex.phpを削除するために.htaccess(DOCUMENT_ROOTの下)で使用できるコードです。

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]
52
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は不要です(サイトがWebルートの下のサブディレクトリにある場合に役立ちます)
  • index.phpが存在する場合は削除されます
  • リクエストは、元のリクエストの完全なクエリ文字列とともに正しいindex.phpにルーティングされます

次の行に注意してください:

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

後で[%{ENV:BASE}]変数を設定する必要があります。 E|envフラグに関するApacheドキュメント を参照してください。

6
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/ )、上記のRewriteRule行のindex.phpの前のスラッシュを削除します。

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

EEをサブディレクトリから実行していて、スラッシュを削除してもそれでも機能しない場合は、書き換えルールでサブディレクトリを指定する必要がある場合があります。たとえば、サブフォルダーの名前がTestingの場合は、次のように変更します。

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

Apache2.4のURLからindex.phpを削除するには、次のルールを使用できます。

 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の回答を参照してください。

1
starkeen

更新された回答

最近では、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のノウハウがありません。

私がやろうとしていることは、ハードリダイレクトを実行してindex.phpを取り除き、そこから内部リダイレクトルールのセットを取得するRewriteRuleを作成することです。例えば:

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

これは、500エラーを生成せずに正しく機能するようです。しかし、もう一度、私は塩ひとつまみをお勧めします。

それは良い解決策とは程遠いですが、私はそれが役立つことを願っています。

1
afeique

答えは私がZend Framework Webサイトで持っていた長期的な問題を解決したので、ここでコメントするために今日、overflow.comに参加することを余儀なくされました。私は3年半ほどウェブサイトに取り組んできましたが、その間に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