jetty transparent proxy always returns 403 forbidd

2019-07-20 21:04发布

问题:

I am trying to use the transparent proxy provided by jetty.

This is my web.xml

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="WebApp_9"
     version="2.4"
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<display-name>Archetype Created Web Application</display-name>

<servlet>
    <servlet-name>googleProxy</servlet-name>
    <servlet-class>org.eclipse.jetty.servlets.ProxyServlet$Transparent</servlet-class>
    <init-param>
        <param-name>ProxyTo</param-name>
        <param-value>http://www.google.com</param-value>
    </init-param>
    <init-param>
        <param-name>Prefix</param-name>
        <param-value>/google</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>googleProxy</servlet-name>
    <url-pattern>/google/*</url-pattern>
</servlet-mapping>

and this is the pom.xml (I am using maven):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>JettyProxySample</groupId>
<artifactId>JettyProxySample</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<name>JettyProxySample Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-servlets</artifactId>
        <version>7.0.0.M4</version>
    </dependency>
</dependencies>
<build>
    <finalName>JettyProxySample</finalName>
    <plugins>
        <plugin>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>maven-jetty-plugin</artifactId>
            <version>6.1.10</version>
            <configuration>
                <scanIntervalSeconds>10</scanIntervalSeconds>
                <stopKey>foo</stopKey>
                <stopPort>9999</stopPort>
            </configuration>
            <executions>
                <execution>
                    <id>start-jetty</id>
                    <phase>pre-integration-test</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <scanIntervalSeconds>0</scanIntervalSeconds>
                        <daemon>true</daemon>
                    </configuration>
                </execution>
                <execution>
                    <id>stop-jetty</id>
                    <phase>post-integration-test</phase>
                    <goals>
                        <goal>stop</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

I expect the proxy to forward a request like this:

http://localhost:8080/JettyProxySample/google/search?q=hello

to this:

http://www.google.com/search?q=hello

But when I try that url in browser, I always get this:

HTTP ERROR: 403

FORBIDDEN
RequestURI=/JettyProxySample/google/search

Powered by Jetty://

Any idea?

回答1:

Just to toss an answer onto here, do not use a milestone release that is years old.

  • 7.6.7.v20120910 for jetty7
  • 8.1.7.v20120910 for jetty8

I know lots of folks using the proxy servlet in both versions successfully, just not something that was from the initial migrations from codehaus to eclipse...there was a serious amount of code churn back then so I would not be surprised if this isn't working correctly for you.



回答2:

Reading the source code helps. :)

The problem is, you don't have your proxy servlet set at the root of the web server, but inside of an application, thus your Prefix parameter needs to include the entire prefix, context-name of web application included...

Prefix/YOUR_WEB_APP_CONTEXT/google

see also