截至目前,我的网站上有一些静态页面,其中一个是/ portfolio。除此之外,我的htaccess隐藏了.html扩展名。我想添加一个项目组合目录,但我不想将现有的项目组合页面作为默认索引文件移动到项目组合目录中。我的/投资组合页面是我的Google附加链接之一,我担心如果它被移动,或者如果网址发生变化,Google会认为它是一个全新的页面。
我的问题是,一旦我添加了/ portfolio /目录,每当我尝试访问原始/组合页面时,会自动添加一个尾部斜杠并链接到目录本身。
我尝试了无数选项,其中一个是/ portfolio / to / portfolio的重写,但这会产生无限循环。我也试过“DirectorySlash Off”,但只是在目录内部删除了尾部斜杠,它没有恢复对原始/组合页面的访问。
最终,我想将我的/投资组合页保持原样,链接到目录内的页面,如so / portfolio / example,如果访问/ portfolio或/ portfolio /,它将导致显示相同的页面在没有谷歌认为它是重复内容的目录之外。
这里存在类似的问题: .htaccess rewriting url to page or directory虽然由于某些原因这仍然导致我的无限循环,我猜它与隐藏的扩展有关。
这是我的htaccess -
RewriteEngine On # HTML to PHP RemoveHandler .html .htm AddType application/x-httpd-php .htm .html # Hide extension RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.html -f RewriteRule ^(.*)$ $1.html # Force WWW RewriteCond %{HTTP_HOST} ^mydomain\.net RewriteRule ^(.*)$ http://www.mydomain.net/$1 [R=301,L] # Blog Subdomain RewriteCond %{HTTP_HOST} ^blog.mydomain.net$ RewriteRule ^(.*)$ http://www.mydomain.net/blog/$1 [R=301,L]
我知道拥有一个与静态页面同名的目录并不是一个好主意,但我真的不想改变现有的页面并丢失Google附加链接,所以处理这个问题的一个干净和正确的方法是帮助
答案 0 :(得分:14)
这里有两件事情“错误”,还有两种解决办法。
首先,在应用重写条件之前,apache“确定”存在名称为“portfolio”的目录。这意味着重写条件正在接收“投资组合/”而不是“投资组合”。
其次,“! - d”规则专门避免了如果实际上存在该名称的目录而要进行的重写
解决方案1:手动重新路由投资组合目录的请求以删除斜杠。
# Manually re-route portfolio/ requests to portfolio
RewriteCond %{REQUEST_FILENAME} portfolio/$
RewriteRule ^(.*)/$ $1
# Hide extension
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
请注意删除“!-d”条件。
这样做的缺点是你必须将“投资组合”边缘案例直接硬编码到重写规则中,并且仍然会导致浏览器首次被重定向到投资组合/
解决方案2:设置DirectorySlash Off并删除目录存在测试
# Disable Automatic Directory detection
DirectorySlash Off
# Hide extension
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
设置DirectorySlash Off会最好地解决此问题,但可能会破坏您实际需要自动DirectorySlash的网站的其他部分。最好的运气,我希望这会有所帮助。
注意在测试解决方案2时,您的浏览器可能会记住“组合”重定向到“组合/”,并在将请求发送到服务器之前执行重定向。请务必在缓存清晰的环境中进行测试,以获得最佳效果。