为什么mod_rewrite将var / www / html添加到生成的URL

时间:2017-03-31 11:17:18

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

我正在努力使我的服务向后兼容,因为我已经将服务移动到一个新的路径internaly,我仍然希望用户使用旧的URL访问它,因为并非所有人都知道这个更改。

如果我在重写规则的末尾添加[R]标志但是它会重定向客户端的网址,我可以完成我想要的工作,这是我不想要的。

我的重写代码:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^/old-path(.*)$ /new-path/$ [L]
</IfModule>

虽然此规则会产生以下网址:

  

的/ var / www / html等/新路径

示例请求类似于:

  

https://host-name/old-path/param1/param2/param3/param4

和重写规则应该只用新路径替换旧路径。

任何人都可以给我一些关于我做错的线索吗?我该如何解决?

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果你的目标是隐藏&#39;重写,试试这个:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^/old-path/(.*)$ /new-path/$1 [P,L]
</IfModule>

如果您真的想要提取主机名:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_HOST} (.*)
  RewriteRule ^/old-path/(.*)$ http://%1/new-path/$1 [P,L]
</IfModule>

由于%1引用了RewriteCond-line的第一个括号... 如果您希望将客户重写为新URI并查看:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^/old-path/(.*)$ https://host-name/new-path/$1 [R=301,L]
</IfModule>

或简而言之,甚至没有使用重写:

RedirectMatch ^/old-path/(.*)$ /new-path/$1

避免&#39; https://host-name/&#39;将您的DocumentRoot更改为&#39; old-path&#39;的父目录特别是&#39; new-path&#39;。