GAE应用程序app.yaml VS .htaccess

时间:2018-07-25 01:19:48

标签: .htaccess google-app-engine

如何编写应用程序Yaml看起来像下面的htacess

    RewriteEngine on
    # To append a query string part in the substitution string
    RewriteRule ^([0-9a-z_/\-]+)/$ index.php\?p=$1 [QSA]
    RewriteRule ^([0-9a-z_/\-]+)$ index.php\?p=$1 [QSA]

我在app yaml上执行GAE应用程序失败

2 个答案:

答案 0 :(得分:1)

正如Dan所提到的,您将无法在Yaml中处理所有这一切,并且需要自己处理逻辑,我们在我们的一个项目中做了类似的事情,并在解决方案下方进行了概述。

我们的方案是处理旧网站文章的URL结构,并尝试将其重定向到新的URL结构。

在我们的Yaml中,我们注册了要匹配的模式,并将其定向到我们将要处理的文件中:

- url: (/.*/[0-9]{4}/[0-9]{2}/[0-9]{2}/.*)  (Pattern to match on)
  script: publication.custom.redirector.app (Path to your .py that will have your handling in)

在我们的.py文件中,我们将捕获该模式并将其路由到我们的DefaultHandler,然后它可以执行您需要的任何逻辑并重定向出: (在我们的项目中,它转到/publication/custom/redirector.py)

import request
import settings
import re

class DefaultHandler(request.handler):

    def get(self, pre, year, month, day, post):

        post = re.sub('(.*[^0-9])[\d]{1}$', r'\1', post)
        post = re.sub('[^0-9a-zA-Z-_\/]+', '', post)
        path = post.split("/")[-1]
        slug = "{0}-{1}-{2}-{3}".format(year, month, day, path)

        article = self.context.call('pub/articles/get', slug=slug.lower())
        if article:
            self.redirect(article['pub_url'], permanent=True)
        else:
            self.render("pages/page-not-found/page-not-found.html")


app = request.app([
    ('/(.*)/([0-9]{4})/([0-9]{2})/([0-9]{2})/(.*)', DefaultHandler)
], settings.gaext.config)

希望这会有所帮助

答案 1 :(得分:0)

GAE [...] <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> </parent> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <!-- <hibernate.version>5.1.0.Final</hibernate.version>--> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> <version>2.0.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- Runtime, for Embedded Elasticsearch, comment this if connect to external elastic search server --> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies> <build> <plugins> <!-- Package as an executable jar/war --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 不具有URL重写功能,它仅分析传入的请求URL以进行请求路由,以确定要调用的处理程序。

也许有人会说app.yaml处理程序配置具有某种相似的功能,但是它仅适用于静态资产。

对于动态处理程序,您需要在应用程序代码中进行此类“重写”。我在这里引用“重写”是因为从技术上讲,它只是解析/解释应用程序代码中的请求URL的另一种方式-原始的,未更改的请求URL仍将是GAE下文记录的内容。