【发布时间】:2022-02-04 20:03:13
【问题描述】:
我有一个关于 mod_rewrite 的问题,我似乎无法解决它。我将示例简化为最基本的内容,但我不明白为什么特定规则会强制我的浏览器重定向而不是重写:
RewriteEngine on
#if request is for a physical-file OR for one of the language paths - skip (return as-is)
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{REQUEST_URI} ^/de [OR]
RewriteCond %{REQUEST_URI} ^/en-US
RewriteRule ^ - [L]
#otherwise: rewrite to en-US folder
RewriteRule ^(.*)$ /en-US/$1 [NC,L,QSA]
我非常仔细地阅读了文档,看起来这实际上应该重写每个调用,所以https://example.com/fuBar.html 实际上应该从我的服务器中检索文件/en-US/fuBar.html - 用户浏览器不应该知道它。
真正发生的是浏览器由于某种原因被重定向到https://example.com/en-US/fuBar.html。虽然这确实显示了正确的内容,但这不是我想要的,也不是我认为RewriteRule 应该做的。我做错了什么?
*add - de 和 en-US 子文件夹的 .htaccess:
RewriteEngine On
# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
# If the requested resource doesn't exist, use index.html
RewriteRule ^ /index.html
【问题讨论】:
-
您还有哪些其他指令?子目录中的任何其他
.htaccess文件(可能在/en-US/.htaccess)?您说您已经“将示例剥离到最简单的部分”,但是,您发布的指令本身不会触发外部重定向。事实上,如果没有任何其他规则,这将导致无限的重写循环(浏览器中的 500 内部服务器错误响应)。 (?) -
想必你正在使用
.htaccess? -
对不起,如果不清楚 - 我是新手,不知道更好。我包含了我的根目录和子文件夹的完整配置 - 都使用 .htaccess
-
这里仍然没有任何东西会触发“重定向”。确保您已清除浏览器(和任何中介)缓存。检查浏览器开发工具中的网络流量——你到底看到了什么?你看到了什么 3xx HTTP 状态码?但是,在您更新之后,您的示例现在不一致 - 当您描述重写为
/en-US时,您的指令现在改写为/de? -
非常感谢您提供有关检查网络选项卡的提示(应该想到这一点)。实际上根本没有发生重定向!而是因为我以某种方式设置了
我的前端(Angular)似乎比我聪明,在我没有意识到的情况下操纵地址。原来我什至不需要改变基本的href,我只需要重写。非常感谢,你让我开心!如果您将有关检查网络流量的提示变成答案,我将很乐意接受它
标签: apache .htaccess mod-rewrite