给定文件结构如下:
|- .htaccess (1)
|- portfolio.html
|- portfolio(dir) -|
|- .htaccess (2)
我想将/ portfolio的任何链接重写为/portfolio.html。问题是还存在一个名为portfolio的目录。
这个问题与这里回答的问题非常相似:
.htaccess, proper rewriting of directory and file with same name
但不幸的是,这并没有解决我的问题。
解决方案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 Off并删除目录存在测试
# Disable Automatic Directory detection
DirectorySlash Off
# Hide extension
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
设置DirectorySlash Off会最好地解决此问题,但可能会破坏您实际需要自动DirectorySlash的网站的其他部分。
确实上面链接堆栈溢出答案的答案确实解决了问题,但前提是目录中没有与文件名同名的.htaccess规则,即.htacess(2)文件中的任何rewriteRule上面停止这个工作。
有人能提出一种实现这一目标的方法吗? 感谢
答案 0 :(得分:1)
此规则适用于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]