2016-09-25 7 views
0

私はこの問題を解決するために、ウェブ上で、特にここでstackoverflowを見てきました。`/ index.php`を最後のスラッシュを含むすべてのURLから削除するには?

私はディレクトリindex.phpというファイルのみを使用します。含まれているものと私的なものはpublic_htmlcpanel)のディレクトリの外にあります。ディレクトリ、アンカーリンクとクエリを使用することにより

は、次のようになります。

http://domain.com/sub/#anchorまたはhttp://domain.com/sub/?query

そして私はそれを好きではありません。人々はこれがSEOのために無関係であることを私に言っているが、私はこれが事実であるとは思わない。まず、の一貫性が必要です.2番目に末尾のスラッシュはの複製を作成します。したがって、は301のリダイレクトが必要です。一貫性と重複は確かにSEOの問題です!

これは私のウェブサイトが構成されている方法のほんの一例です:

/ 
·--index.php 
| 
·--/about-us/ 
| | 
| ·--index.php 
·--/contact-us/ 
    | 
    ·--index.php 

ユーザーがabout-usがディレクトリであることを知っていることはありません、そして、彼らは最後の末尾がとにかくスラッシュを入力しません。重複やHTTPエラーが発生します。 Web上

私は唯一の非作業例を見つけた、と私は理解してきた何のためとして、私は内部に持っている最後のスラッシュとindex.phpを追加します。これは、セキュリティ上の問題を避けるために役立ち、すべてのものを動作させます!

Hereおよびhere似たような質問をしました。しかしその場合は、/publicディレクトリを作成しなければなりませんでした。今私はホストを変更する管理している、私はPHPファイルを格納するために非パブリックディレクトリを使用することができるようになります。

私はもう/publicディレクトリが不要なので、そのコードの一部をコピーして新しい.htaccessに貼り付けました。ここで

は、コードがサブディレクトリにではなく、ルートにうまく動作するようです.htaccess

# Options 
Options +FollowSymLinks -MultiViews -Indexes 
DirectoryIndex index.php index.html 
DirectorySlash off 

# Enable Rewrite Engine 
RewriteEngine on 
RewriteBase/

# www to non-www 
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
RewriteCond %1##%{HTTPS}s ^(.+)##(?:on(s)|) 
RewriteRule^http%2://%1%{REQUEST_URI} [L,R=301,NE] 

# remove trailing slash from all URLs 
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s] 
RewriteRule ^(.+)/$ /$1 [R=301,L,NE] 

# To externally redirect /dir/file.php to /dir/file 
RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC] 
RewriteRule^/%1 [R=301,NE,L] 

# internally add trailing/to directories 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule !/$ %{REQUEST_URI}/ [L] 

# To internally forward /dir/file to /dir/file.php 
RewriteCond %{DOCUMENT_ROOT}/$1.php -f [NC] 
RewriteRule ^(.+?)/?$ $1.php [L] 

<FilesMatch ^\.> 
    order allow,deny 
    deny from all 
</FilesMatch> 

<Files *.inc> 
    order allow,deny 
    deny from all 
</Files> 

です。上記のコードは/publicサブディレクトリで動作するように調整されているためです。

どうすればrootでも動作させることができますか?

合計で301回のリダイレクトが必要です。それ以外の場合は、コンテンツの重複が発生します。

http://www.domain.com/ R - >http://domain.com/

http://domain.com/ R - >http://domain.com

http://domain.com/sub/ R - >http://domain.com/sub

http://domain.com/sub/index.php R - >http://domain.com/sub

http://domain.com/sub/index.php#anchor R - >http://domain.com/sub#anchor

http://domain.com/sub/#anchor R - >http://domain.com/sub#anchor

+0

ブラウザでは、 'http://domain.com/R-> http:// domain.com'が既に行われているはずです。 – anubhava

+0

別の点として、アンカーはサーバー側では処理できません。サーバーはHTTP要求で '#anchor 'を取得しない、つまりApacheログでは' http:// domain.com/sub/'のみが受信されます。 – anubhava

+0

'/ index.php'を削除するにはどうすればよいですか? – dcdeiv

答えて

0

これらのルールを使用して、index.phpの削除を含むすべての要件を満たすことができます。サーバーはHTTPリクエストで#anchorを取得しないため、アンカーは保存できません。つまり、Apacheログにはhttp://domain.com/sub/のみが受信されます。

# Options 
Options +FollowSymLinks -MultiViews -Indexes 
DirectoryIndex index.php index.html 
DirectorySlash off 

# Enable Rewrite Engine 
RewriteEngine on 
RewriteBase/

# www to non-www 
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
RewriteCond %1##%{HTTPS}s ^(.+)##(?:on(s)|) 
RewriteRule^http%2://%1%{REQUEST_URI} [L,R=301,NE] 

# remove index.php 
RewriteCond %{THE_REQUEST} \s/*(/.*)?/index\.php[?\s] [NC] 
RewriteRule^%1 [L,R=301,NE] 

# remove trailing slash from all URLs 
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s] 
RewriteRule ^(.+)/$ /$1 [R=301,L,NE] 

# To externally redirect /dir/file.php to /dir/file 
RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC] 
RewriteRule^/%1 [R=301,NE,L] 

# internally add trailing/to directories 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule [^/]$ %{REQUEST_URI}/ [L] 

# To internally forward /dir/file to /dir/file.php 
RewriteCond %{DOCUMENT_ROOT}/$1.php -f [NC] 
RewriteRule ^(.+?)/?$ $1.php [L] 

<FilesMatch ^\.> 
    order allow,deny 
    deny from all 
</FilesMatch> 

<Files *.inc> 
    order allow,deny 
    deny from all 
</Files> 
0

通常のURLのディレクトリ構造と戦っています。後ろにスラッシュを入れないでください。あなたのブラウザがそれを隠していてもhttp://domain.comのようなURLはありません。要求にスラッシュがまだ送られていて、アドレスバーからコピーされたURLに再び追加されます。

単一ドメインのリダイレクトを行うのは良いことです。 http://domain.com/fooからhttp://domain.com/foo/への自動301リダイレクト(Apacheが行う種類)はSEOに適しています。最初にURLにあるindex.php文字列はどうですか?彼らがそこにいる必要はありません。すべてのあなた自身のリンクが自由であることを確かめてください。一意のページのみが索引付けされるようにする最も簡単な方法は、<link rel=canonical href="…">です。

+0

したがって、後続のスラッシュと301のスラッシュされていないリンクをスラッシュしたリンクにリダイレクトしないことをお勧めしますか? – dcdeiv

+0

はい、それはApacheが既にやろうとしていることですが、開発ツールのウィンドウのネットワークタブを確認して、302ではなく301であることを確認してください。 'index.php'を使って他のサイトのあなたのリンクを心配しないでください。時間の経過とともに消えてしまいます。あなたがそれらを使用せずにカノニカルを使用する限り、優れた検索エンジンの結果を得ることができ、実際にはリダイレクトの必要性が減り、パフォーマンスが向上します。 – Walf

+0

Apacheの設定を 'DirectorySlash'に変更して、リダイレクトのパフォーマンスが低下するのを避けることもできますが、ドキュメントのセキュリティノートに注意してください。 – Walf

関連する問題