.htaccess,正确重写同名目录和文件

Pau*_*ulC 11 .htaccess

截至目前,我的网站有一些静态页面,其中一个是/组合.除此之外,我的htaccess隐藏了.html扩展名.我想添加一个项目组合目录,但我不想将现有的项目组合页面作为默认索引文件移动到项目组合目录中.我的/投资组合页面是我的Google附加链接之一,我担心如果它被移动或者如果网址发生变化,Google会认为它是一个全新的页面.

我的问题是,一旦我添加了/ portfolio /目录,每当我尝试访问原始/组合页面时,会自动添加一个尾部斜杠并链接到目录本身.

我尝试了无数的选项,一个是/ portfolio/to/portfolio的重写,但是这会产生无限循环.我也试过"DirectorySlash Off",但只是在目录内部删除了尾部斜杠,它没有恢复对原始/组合页面的访问.

最后,我想保持我的/组合页面按原样,链接到目录中的页面,如so/portfolio/example,如果访问/ portfolio或/ portfolio /,它将导致显示相同的页面,没有Google认为它是重复内容的目录.

这里存在一个类似的问题: .htaccess重写url到页面或目录虽然由于某种原因这仍然导致我的无限循环,我猜它与隐藏的扩展有关.

这是我的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]

我知道这是不是具有相同的名称作为静态页面的目录中一个伟大的想法,但我真的宁愿不改变现有的页面,并失去了谷歌网站连结,所以清洁和适当的方式来处理,这将是一个帮助.

Jam*_*ney 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
Run Code Online (Sandbox Code Playgroud)

请注意删除"!-d"条件.

这样做的缺点是你必须将"组合"边缘案例直接硬编码到重写规则中,并且仍然会导致浏览器首先被重定向到组合/

解决方案2:设置DirectorySlash Off并删除目录存在测试

# Disable Automatic Directory detection
DirectorySlash Off

# Hide extension
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
Run Code Online (Sandbox Code Playgroud)

设置DirectorySlash Off会最好地解决此问题,但可能会破坏您实际需要自动DirectorySlash的站点的其他部分.祝你好运,我希望这会有所帮助.

请注意,在测试解决方案2时,您的浏览器可能会记住"组合"重定向到"组合/",并在将请求发送到服务器之前执行重定向.请务必在缓存清晰,干净的环境中进行测试,以获得最佳效果.