如何从所有URL中删除`/ index.php`,包括最后的斜杠?

时间:2016-09-25 12:07:52

标签: apache .htaccess redirect mod-rewrite

我一直在寻找网络,特别是在这个问题的答案的stackoverflow上。

我只使用带有index.php文件的目录。 Includables和私有内容在public_html cpanel )目录之外。

通过使用目录,锚链接和查询将如下所示:

http://domain.com/sub/#anchorhttp://domain.com/sub/?query

我只是不喜欢它。人们一直告诉我这与搜索引擎优化无关,但我不认为情况就是这样。首先是因为我想要一致性,其次,尾随斜杠会创建重复,因此我需要301重定向!一致性和重复确实是SEO问题!

这只是我网站结构的一个例子:

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

用户永远不会知道about-us是一个目录,他们无论如何都不会输入最后一个尾部斜杠。这会产生重复和HTTP错误。

在网络上,我发现只有非工作示例,至于我所理解的内容,我必须在内部添加尾随斜杠和index.php 。这有助于避免安全问题并使所有事情都有效!

Herehere我问了类似的问题。但在那种情况下,我必须创建/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>

代码似乎在子目录中运行良好,但在root目录中运行不正常。我想这是因为上面的代码是为了适应/public子目录而定制的。

我怎样才能让它在root上运行?

总结一下,我需要301重定向,否则会有重复的内容!!

http://www.domain.com/ R - &gt; http://domain.com/

http://domain.com/ R - &gt; http://domain.com

http://domain.com/sub/ R - &gt; http://domain.com/sub

http://domain.com/sub/index.php R - &gt; http://domain.com/sub

http://domain.com/sub/index.php#anchor R - &gt; http://domain.com/sub#anchor

http://domain.com/sub/#anchor R - &gt; http://domain.com/sub#anchor

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

不要修剪尾随斜杠,你正在与URL的正常目录结构作斗争。即使您的浏览器隐藏了这个URL,也没有http://domain.com这样的URL,斜杠仍在请求中发送,并将被添加回从地址栏复制的URL。

为单个域执行重定向很好。从http://domain.com/foohttp://domain.com/foo/的自动301重定向(Apache所做的那种)有利于SEO。首先,您的网址中的index.php字符串如何?他们没有必要在那里;确保所有自己的链接都没有。确保仅对唯一页面进行索引的最简单方法是使用<link rel=canonical href="…">