给定的文件结构如下:
|- .htaccess (1)
|- portfolio.html
|- portfolio(dir) -|
|- .htaccess (2)
我想将任何带有/ portfolio的链接重写为/portfolio.html。问题在于还存在一个名为Portfolio的目录。
这个问题与在这里回答的问题非常相似:
.htaccess,具有相同名称的目录和文件的正确重写,
但是不幸的是,这并不能完全解决我的问题。
解决方案1:手动重新路由对投资组合目录的请求以删除斜杠。
# Manually re-route portfolio/ requests to portfolio
RewriteCond %{REQUEST_FILENAME} portfolio/$
RewriteRule ^(.*)/$ $1
# Hide extension
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
这样做的不利之处在于,您必须将“组合”边缘的大小写直接硬编码到重写规则中,并且仍然会导致浏览器首先被重定向到产品组合/
解决方案2:关闭DirectorySlash并删除目录存在测试
# Disable Automatic Directory detection
DirectorySlash Off
# Hide extension
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
将DirectorySlash设置为Off可以最好地解决此问题,但可能会破坏您实际需要自动DirectorySlash的站点的其他部分。
确实,上述链接堆栈溢出答案的答案确实可以解决问题,但前提是目录中没有与文件名同名的.htaccess规则,即上述.htacess(2)文件中的任何rewriteRule都可以阻止此问题。在职的。
谁能建议实现这一目标的方法?谢谢
此规则应适用于您的htaccess (2)
:
RewriteEngine On
RewriteCond %{REQUEST_URI}::$1 ^(.*?)/(.*)::\2$
RewriteRule ^(.*)$ - [E=BASE:%1]
# if .html exists then use it
RewriteCond %{DOCUMENT_ROOT}%{ENV:BASE}\.html -f [NC]
RewriteRule ^$ /%{ENV:BASE}.html [L]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句