【问题标题】:.htaccess, rewriting of filename with same name as directory.htaccess,重写与目录同名的文件名
【发布时间】:2014-08-18 10:51:52
【问题描述】:

给定一个文件结构如下:

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

任何人都可以提出实现这一目标的方法吗? 谢谢

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite


    【解决方案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]
    

    【讨论】:

    • 感谢您的回复。仅当目录中的 .htaccess 中没有 RewriteRule 时,您的解决方案才有效(即上例中的 htaccess (2))。这与上面提到的前两个解决方案的行为相同。
    • 只有当您在htaccess (2) 中有RewriteEngine On 行时,它才会不起作用。这也是预期的行为,因为 .htaccess 是每个目录指令,所以无论最接近的父级的 .htaccess 是什么都会生效。如果您愿意编辑htaccess (2),那么这很容易实现。
    • 我需要对 htaccess (2) 做些什么才能使其正常工作?你是说如果我在 htaccess (2) 中打开了 RewriteEngine,我就无法让这个场景工作吗?
    • 这似乎工作非常感谢你。我会仔细研究规则,看看你是如何做到的。
    • 不客气,很高兴它成功了。这可以通过在第一条规则中设置动态 RewriteBase 变量来实现。
    猜你喜欢
    • 2013-11-18
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    相关资源
    最近更新 更多