我有这个工作规则:
RewriteRule ^(.*)/amp/$ https://example.com/$1?amp=1 [QSA,R=301,NC,NE,L]
用于重定向https://example.com/register/amp/
到https://example.com/register?amp=1
。
而且它运行良好,但我希望浏览器中的 URL 没有改变,这样它会加载register?amp=1
,但在浏览器中仍然显示/register/amp/
。
为了实现此行为,我尝试修改为:
RewriteRule ^(.*)/amp/$ ./app.php/$1?amp=1 [QSA,R=301,NC,NE,L]
但随后它会重定向到https://example.com/home/user/public_html/register?amp=1
。
因此,它错误地添加了文档根目录,我不知道如何修改规则来实现这一点。
答案1
RewriteRule ^(.*)/amp/$ ./app.php/$1?amp=1 [QSA,R=301,NC,NE,L]
您需要删除R
(外部“重定向”)标志./
。代换字符串在这里也是多余的,只是增加了操作系统必须优化的复杂性。
指定相对路径时代换在目录上下文中(.htaccess
或<Directory>
服务器配置中的容器中),并且您没有使用指令声明替代前缀(或“基本”目录)RewriteBase
,那么 Apache 会在重写过程结束时重新添加目录前缀(即/home/user/public_html/
本例中)。这是因为这是一个外部重定向,所以您在格式错误的重定向中公开了这个目录前缀。您需要进行内部重写。
例如:
RewriteRule ^(.*)/amp/$ app.php/$1?amp=1 [QSA,NC,NE,L]
然而,你也包括app.php
了代换,你没有在目标网址中显示?(app.php
可能正确 - 你应该重写为实际的文件系统路径并且不依赖于 mod_dir 的任何额外重写或子请求。)