【问题标题】:How to mod_rewrite so all paths are proxied except base path, using .htaccess如何使用 .htaccess mod_rewrite 使所有路径都被代理,除了基本路径
【发布时间】:2013-08-13 15:03:53
【问题描述】:

我正在尝试使用 mod_rewrite 为我的网站编写一些代理重写规则,但无法使其正常工作。请帮帮忙,mod_rewrite 高手。

我需要在保留 URI 的同时将所有子路径代理到外部服务器,但我不想重写基本路径 /。

我不知道子路径的名称,我希望它被视为通配符 /[/[/*...]]

  • www.domain.com/ -> www.domain.com/index.php
  • www.domain.com/xxx/ -> www.external-server.com/xxx/
  • www.domain.com/xxx/yyy/ -> www.external-server.com/xxx/yyy/
  • www.domain.com/xxx/yyy/zzz/ -> www.external-server.com/xxx/yyy/zzz/

我可以像这样轻松地代理所有 URI 上的调用:

RewriteEngine On 
RewriteRule (.*) http://www.external-server.com/$1 [P,QSA]

有人知道一套工作规则和 cond 支持我的用例吗?

提前致谢!// 埃德什

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    如果我对你的理解正确,那么这样的事情应该对你有用。

    RewriteEngine On
    
    RewriteCond %{REQUEST_URI} ^/
    RewriteRule (.*) http://www.domain.com/index.php [L,P,QSA]
    
    RewriteCond %{REQUESTURI} !^/
    RewriteRule (.*) http://www.external-server.com/$1 [P,QSA]
    

    【讨论】:

    • 谢谢皮蒂!但它最终进入一个循环,给出 HTTP 400 错误请求。有什么想法吗?
    • 使用您的代码:domain.com -> 错误请求 domain.com/xxx -> 错误请求 domain.com/index.php -> 有效
    • 第二个条件的 RewriteCond 中的错字顺便说一句。应该是 %{REQUEST_URI}。尝试删除整个第一个条件和规则。
    • 现在它就像我描述的用例一样工作。我稍微调整了你的配置,Petey!我猜这个问题是由于在基本 URI 重写上使用了相同的域。我将 [L, P, QSA] 更改为 [L, R, QSA]
    • 嗯,有道理。好东西。
    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 2015-05-06
    • 2011-05-10
    • 2011-03-20
    • 1970-01-01
    • 2016-03-26
    • 2018-10-03
    • 2010-11-26
    相关资源
    最近更新 更多