【问题标题】:htaccess - redirect directory to file with same namehtaccess - 将目录重定向到同名文件
【发布时间】:2017-06-17 18:39:49
【问题描述】:

我似乎遇到了一个我找不到解决方案的问题。

我设置了一个目录和一个同名文件,但我似乎找不到将目录重定向到根文件夹中文件的方法。我找到的所有信息都是用于重写或重定向到子目录中的文件。

目录:example.com/en-gb/

文件:example.com/en-gb(使用 htaccess 删除扩展名)

当前htaccess(相关部分):

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]
RewriteRule ^$ /en-gb [L]
RewriteCond %{REQUEST_URI} ^/en-gb/$
RewriteRule . ../en-gb [R,L]

这只会导致以下错误:

您无权访问此服务器上的 /en-gb/.html。

有什么想法吗?这甚至可能吗?

【问题讨论】:

  • “使用 htaccess 删除扩展” - 所以文件确实有扩展名?大概是en-gb.html?重写到实际文件的指令和这些指令的顺序将很重要 - 这些应该添加到您的问题中。
  • 澄清一下,您实际上并没有删除带有.htaccess 的扩展名——是吗? .htaccess 用于添加扩展名(将 URL 转换回文件系统路径),而不是删除它。
  • 是的,我以错误的方式表达了自己。我用它从 url 中删除扩展名,但当然它仍然存在于文件后面

标签: apache .htaccess redirect mod-rewrite


【解决方案1】:

通常,当您请求 /directory 时,mod_dir 会发出 301 重定向以附加尾部斜杠,即。 /directory/(“修复”URL)。 mod_dir 然后能够从该目录中提供目录索引文档。

不幸的是,这似乎发生在 mod_rewrite 能够处理请求之前。因此,您将不得不在 .htaccess 中禁用此行为:

DirectorySlash Off

然后您可以在内部将请求重写为文件。例如。 /directory 会在内部重写为 /directory.html(如果存在):

RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule ^([^.]+)$ $1.html [L]

但是,禁用 DirectorySlash 有一些注意事项 - 您将必须确保对目录的任何请求都已经带有斜杠(或者在 .htaccess 中检查这一点)。并注意文档中的安全警告。

参考:
https://httpd.apache.org/docs/current/mod/mod_dir.html#directoryslash

【讨论】:

    猜你喜欢
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2011-12-26
    • 2017-01-29
    • 2021-09-03
    • 2011-01-19
    • 1970-01-01
    相关资源
    最近更新 更多