What does the RewriteRule in .htaccess convert to

2019-07-03 09:02发布

How do I convert this .htaccess file to an app.yaml file?

Here is the .htaccess file:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(?!.*?public).* index.php [QSA,L]

I need to do this to run an app using PHP on Google App Engine.

The reason I'm asking this question, is because Google specifically recommends a code example in their official documentation that is stored in Git Hub called Dr Edit. The Dr Edit code example has a .htaccess file, but no app.yaml file. And, in the READ ME file, the very first step for setting up the application, is to create a Google App Engine application. So I guess Google has provided a code example that insinuates it will run on Google App Engine, but it won't.

Supposedly Google is monitoring Stack Overflow for issues related to GAE, so I hope they read this.

3条回答
乱世女痞
2楼-- · 2019-07-03 09:45

As the name .htaccess implies, it can control access to a directory. The .htaccess files are read on every request. I guess that means that every HTTP request to the domain name must go through the .htaccess file. So it seems like the .htaccess file is like a gatekeeper. From Wikipedia, it seems that the .htaccess file can be used to block certain IP address from loading a web page.

The first line of the .htaccess file is: RewriteEngine On

That line of code: RewriteEngine is an Apache Directive which turns the Apache Rewriting Engine on or off.

So that .htaccess file is looking at every request, taking the request, then pushing out a different request.

It seems that the app.yaml file can not directly take one URL request, and push out a different request, BUT the app.yaml file can take a URL request, and then run a PHP script, that will change the request.

So, in the app.yaml file, the section that takes the URL, then redirects to a script, would look like this:

Catch the incoming URL requests and cause the mod_rewrite.php file to run.

- url: /Put the incoming URL you want to monitor, catch and redirect here
  script: mod_rewrite.php

Redirect URL requests with app.yaml

The second line of the .htaccess file is:

RewriteCond %{REQUEST_FILENAME} !-f

This is a test, looking for a match in the incoming URL request. The -f at the end is for:

-f (is regular file) Treats the TestString as a pathname and tests whether or not it exists, and is a regular file.

Oh wait! There is an exclamation point in front of it. That's probably a test for logical not. So, if it's NOT a regular file?

Whatever that means. What is the difference between a regular file and everything else? What's an irregular file? lol idk. Anyway, it's looking for a file I guess.

From the Apache documentation, here is a quote:

Server-Variables: These are variables of the form %{ NAME_OF_VARIABLE } where NAME_OF_VARIABLE can be a string taken from the following list:

So that %{REQUEST_FILENAME} part of the second line is what Apache is calling a Server-Variable, and the specific Server-Variable is REQUEST_FILENAME.

Here is a quote from the Apache documentation:

REQUEST_FILENAME The full local filesystem path to the file or script matching the request, if this has already been determined by the server at the time REQUEST_FILENAME is referenced. Otherwise, such as when used in virtual host context, the same value as REQUEST_URI. Depending on the value of AcceptPathInfo, the server may have only used some leading components of the REQUEST_URI to map the request to a file.

So I guess the .htaccess file is looking for something that looks like a path to files on your local computer?

Finally there is the Rewrite Rule Apache RewriteRule

What is the QSA at the end for? I guess it's called a flag, and:

Using the [QSA] flag causes the query strings to be combined

QSA seems to stand for Query String Append. If the incoming URL has a query string on the end of it, how do you want it dealt with?

The [L] prevents any further rewriting rules to be appended

Appache L rewrite flag Appache Documentation QSA

The character (^) is called a caret. I don't know why it's used at the beginning. The syntax for the Appache Rewrite directive is:

RewriteRule pattern target [Flag1,Flag2,Flag3]

So the caret is part of the pattern being detected. That target is simply index.php. So it looks like if lots of different possible requests simply get routed back to the index.php file, which is the very first thing the application runs.

The asterisk at the end is probably a wildcard for any extension.

查看更多
Luminary・发光体
3楼-- · 2019-07-03 09:48

I think you're out of luck :-( Rewrite is an Apache module but AppEngine is based on Jetty, so you must redesign for that. You might be able to use one of the Bundled Servlets, Filters, and Handlers but none of them are a direct substitute for Apache Module mod_rewrite. Some people have used Apache as a front end before Jetty, but that is a clumsy approach. Sorry.

查看更多
来,给爷笑一个
4楼-- · 2019-07-03 09:57

Here is information about how to simulate Apache mod_rewrite $_GET['q'] routing for a PHP App Engine app, in case that's helpful.

查看更多
登录 后发表回答