.htaccess,重写与目录同名的文件名

时间:2014-08-18 10:51:53

标签: regex apache .htaccess mod-rewrite

给定文件结构如下:

|- .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上面停止这个工作。

有人能提出一种实现这一目标的方法吗? 感谢

1 个答案:

答案 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]