Apache重写到一个位置

时间:2015-09-23 22:48:00

标签: apache rewrite

我们有一个Web应用程序可以处理不同的URL格式,并以不同的格式返回相同的内容。

/dosomething
/foo/dosomething (returns mobile content)
/bar/dosomething (returns html for a browser)

请参阅下面的示例虚拟主机。

对于Apache 2.2,我使用重写规则将http://www.foobarbaz.net/dosomething重定向到位置" / baz /"它按照我的预期运作。

" PT" RewriteRule上的标志将URI传递回Apache,并允许我们提供来自" baz"位置。

<VirtualHost *:80>
    ServerName www.foobarbaz.net
    RewriteEngine On

    #Block requests for favicon
    RewriteRule ^/favicon.ico$  - [F] 

    # If the requested URI is NOT located in bar or foo
    # Prepend an /baz to everything that does not already starts with it
    # and force the result to be handled by the next URI-handler ([PT])
    RewriteCond %{REQUEST_URI} !^/bar/.*$
    RewriteCond %{REQUEST_URI} !^/foo/.*$
    RewriteRule ^/(.*) /baz/$1 [PT,QSA]

    <Location "/baz/">
        RequestHeader append ABC-Request-Origin "/baz"
        ProxyPass ajp://localhost:8009/webapp/
        ProxyPassReverse /
        ProxyPassReverseCookiePath /webapp /
    </Location>
    <Location "/bar/">
        RequestHeader append ABC-Request-Origin "/bar"
        ProxyPass ajp://localhost:8009/webapp/
        ProxyPassReverse /
        ProxyPassReverseCookiePath /webapp /bar/
    </Location>
    <Location "/foo/">
        RequestHeader append ABC-Request-Origin "/foo"
        ProxyPass ajp://localhost:8009/webapp/
        ProxyPassReverse /
        ProxyPassReverseCookiePath /webapp /foo/
    </Location>
</VirtualHost>

对于Apache 2.4.12,重写规则的功能不同,Apache会尝试在文件系统上查找内容。 Apache寻找一个&#34; baz&#34;目录不存在。

我尝试添加其他位置&#34; /&#34;并删除重写规则(见下文)。

文档表明,对于重叠的位置,最不具体的位置应该先行。

http://httpd.apache.org/docs/current/sections.html

适用于&#34; /&#34;,但不适用于&#34; / foo /&#34;或&#34; / bar&#34;。似乎&#34; /&#34;总是被使用和&#34; foo&#34;和&#34; bar&#34;始终包含在对p.roxy

的请求中
<VirtualHost *:80>
    ServerName www.foobarbaz.net
    <Location "/">
        RequestHeader append ABC-Request-Origin "/baz"
        ProxyPass ajp://localhost:8009/webapp/
        ProxyPassReverse /
        ProxyPassReverseCookiePath /webapp /
    </Location>
    <Location "/bar/">
        RequestHeader append ABC-Request-Origin "/bar"
        ProxyPass ajp://localhost:8009/webapp/
        ProxyPassReverse /
        ProxyPassReverseCookiePath /webapp /bar/
    </Location>
    <Location "/foo/">
        RequestHeader append ABC-Request-Origin "/foo"
        ProxyPass ajp://localhost:8009/webapp/
        ProxyPassReverse /
        ProxyPassReverseCookiePath /webapp /foo/
    </Location>
</VirtualHost>

是否有人就如何改进此设置提出建议?或者处理对&#34; /&#34;的请求的建议;不同的是&#34; / foo&#34;或&#34; / bar&#34;

感谢您的帮助。

吉姆

1 个答案:

答案 0 :(得分:0)

首先使用位置“/”可以正确使用“/”,“/ foo”和“/ bar”的位置我还有其他与在应用程序中构建链接相关的问题,但我不相信这是一个Apache问题。