我一直在寻找网络,特别是在这个问题的答案的stackoverflow上。
我只使用带有index.php
文件的目录。 Includables和私有内容在public_html
( cpanel )目录之外。
通过使用目录,锚链接和查询将如下所示:
http://domain.com/sub/#anchor
或http://domain.com/sub/?query
我只是不喜欢它。人们一直告诉我这与搜索引擎优化无关,但我不认为情况就是这样。首先是因为我想要一致性,其次,尾随斜杠会创建重复,因此我需要301重定向!一致性和重复确实是SEO问题!
这只是我网站结构的一个例子:
/
·--index.php
|
·--/about-us/
| |
| ·--index.php
·--/contact-us/
|
·--index.php
用户永远不会知道about-us
是一个目录,他们无论如何都不会输入最后一个尾部斜杠。这会产生重复和HTTP错误。
在网络上,我发现只有非工作示例,至于我所理解的内容,我必须在内部添加尾随斜杠和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>
代码似乎在子目录中运行良好,但在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
答案 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/foo
到http://domain.com/foo/
的自动301重定向(Apache所做的那种)有利于SEO。首先,您的网址中的index.php
字符串如何?他们没有必要在那里;确保所有自己的链接都没有。确保仅对唯一页面进行索引的最简单方法是使用<link rel=canonical href="…">
。