【问题标题】:htaccess - Redirect to subfolder without changing browser URLhtaccess - 重定向到子文件夹而不更改浏览器 URL
【发布时间】:2017-01-05 14:57:50
【问题描述】:

我有一个域,其中包含一个带有网络应用程序结构的子文件夹。我在我的根域上添加了一个.htaccess 以指向我的子文件夹 Web 应用程序上的公用文件夹。它工作正常,但是当我输入 www.example.com 时,浏览器 URL 会更改为 www.example.com/subfolder/public,但我希望它不会改变。

这是我的.htaccess

RewriteEngine On
RewriteRule ^.*$ subfolder/public [NC,L]

编辑

第一个 .htaccess 用于重定向子文件夹/公共,其中还有另一个 .htaccess 可以完成所有工作。

这里是位于www.example.com/subfolder/public/ 的第二个.htaccess 的代码:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

【问题讨论】:

  • 您当前的指令应该可以正常工作 - 它不应该重定向。确保您已清除浏览器缓存。 (旁白:你也不需要NC 标志)
  • 是的,我写的很好,但是浏览器上的 url 改变了,我希望重定向请求,而不改变浏览器上的 url
  • 如果您看到重定向(即浏览器中的 URL 正在更改),那么 something else 似乎正在执行此操作。单独的上述指令不能做这样的重定向。 .htaccess 中还有其他指令吗?文件系统路径上还有其他.htaccess 文件吗? (注意“外部重定向”和“内部重写”之间的区别。您的代码显示的是重写,而不是重定向。)
  • 是的,我有 2 个不同的 .htaccess,我在 domainRoot 上发布了一个,然后在 subfolder/public 上发布了另一个 .htaccess,它重定向到正确的文件并完成所有工作,第一个我仅用于将请求重定向到第二个
  • 这就是问题所在。 subfolder/public/.htaccess 中的任何 mod_rewrite 指令将完全覆盖(默认情况下)父 .htaccess 文件中的 mod_rewrite 指令。因此,上述指令甚至没有被处理。添加您的其他 .htaccess 文件的内容。

标签: apache .htaccess redirect mod-rewrite url-rewriting


【解决方案1】:

抱歉,刚刚意识到发生了什么。与子目录中的第二个.htaccess文件无关,如cmets中所述。

RewriteRule ^.*$ subfolder/public [NC,L]

由于public 是文件系统上的物理目录,因此在内部重写该目录时需要包含尾部斜杠。否则, mod_dir 将尝试通过附加斜杠来“修复” URL - 这就是外部重定向的来源。 (mod_dir 隐式触发从subfolder/publicsubfolder/public/ 的外部重定向。)

因此,请在您的根 .htaccess 文件中尝试以下操作:

RewriteRule .* subfolder/public/ [L]

重要的是尾随斜杠。 RewriteRule pattern 上的锚点(^$)不是必需的,因为您要匹配所有内容。出于同样的原因,NC 标志也不需要。

和往常一样,在测试之前确保浏览器缓存是清除的。


UPDATE#1: 上面的单个指令将所有内容(包括静态资源)重写到目录subfolder/public/,然后依赖子目录中的第二个.htaccess 文件以正确路由请求。为了允许正确重写静态资源(在 HTML 中表示为根相对 URL 路径,形式为 "/js/myjs.js"),您将需要额外的指令来重写这些。

例如,专门将所有.js.css文件重写到/subfolder/public/...中的真实位置

# Rewrite static resources
RewriteRule (.+\.(?:js|css))$ subfolder/public/$1 [L]

# Rewrite everything else to the "public" directory
RewriteRule .* subfolder/public/ [L]

更新#2:为了使上述内容更通用,并重写任何静态资源(图像、PDF、.txt 等...),我们可以检查对于重写之前文件的存在,例如:

# Rewrite static resources
RewriteCond %{DOCUMENT_ROOT}/subfolder/public/$1 -f
RewriteRule (.+) subfolder/public/$1 [L]

# Rewrite everything else to the "public" directory
RewriteRule .* subfolder/public/ [L]

这意味着如果任何.css 不存在,它将被传递给subfolder/public/

【讨论】:

  • 以这种方式它可以部分工作,它将index.php加载到公用文件夹中,而不更改url(我想要的),但现在它无法加载公用文件夹中的静态文件(比如:css、js、图片)
  • 如果我将静态文件移动到根文件夹中可能会正常工作,但如果可能的话我不会更改此结构
  • 您为静态文件使用的 URL 路径是什么?上述指令将 everything 重写为 subfolder/public/,如果 URL 路径来自文档根目录,则包括静态文件。您可能需要包含在您的其他 .htaccess 文件中使用的类似异常,或包含对静态文件的额外重写。
  • 也许我明白这个问题,但我无法解决它。对于静态文件我需要重定向到subfolder/public/+静态文件请求的路径(例如subfolder/public/js/myjs.js你知道怎么做吗?
  • 所以你的 HTML 使用了src="subfolder/public/js/myjs.js"? 形式的relative-path
猜你喜欢
  • 2016-06-03
  • 1970-01-01
  • 2014-10-26
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多