问题
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.
回答1:
Here is information about how to simulate Apache mod_rewrite $_GET['q'] routing for a PHP App Engine app, in case that's helpful.
回答2:
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.
回答3:
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.
来源:https://stackoverflow.com/questions/21226114/what-does-the-rewriterule-in-htaccess-convert-to-in-an-app-yaml-file