How was a URL like http://stackoverflow.com/posts/

2019-02-26 02:42发布

问题:

When you edit a question on stackoverflow.com, you will be redirected to a URL like this:

https://stackoverflow.com/posts/1807421/edit

But usually, it should be

https://stackoverflow.com/posts/1807491/edit.php

or

https://stackoverflow.com/posts/edit.php?id=1807491

How was

https://stackoverflow.com/posts/1807421/edit created?

I know that Stackoverflow.com was not created by using PHP, but I am wondering how to achieve this in PHP?

回答1:

With apache and PHP, you might perform one of your examples using a mod_rewrite rule in your apache config as follows:

RewriteEngine On
RewriteRule ^/posts/(\d+)/edit /posts/edit.php?id=$1

This looks for URLs of the "clean" form, and then rewrites them so that they are internally redirected to a particular PHP script.

Quite often rules like this are used to route all requests into a common controller script, which might do something like instantiate a "PostsController" class and ask it to handle an edit request. This is a common feature of most PHP application frameworks.



回答2:

It's called routing. Take a look at tutorials on the subject.

If you use a framework such as cake php it should be built in.



回答3:

As @mr-euro stated you can use mod_rewrite but front controller is a far better solution. You force every request to index.php and you write your application controlling in index.php.



回答4:

You use Apache's .htaccess/mod_rewrite, and optionally a PHP file, which is the approach I like to take myself.

For the .htaccess, something like this:

RewriteEngine On
RewriteRule ^(.*)$ index.php

Then in your PHP file, you can do something like this:

The following should get everything after the first slash.

$url = $_SERVER['REQUEST_URI'];

You can then use explode to turn it into an array.

$split = explode('/', $url);

Now you can use the array to determine what to load:

if ($split[1] == 'home')
{
// display homepage
}

The array is starting from 1 since 0 will usually be empty.



回答5:

It's indeed done by mod_rewrite, or with multiviews. But i prefer mod_rewrite.

First: you create a .htaccessfile with these contents:

RewriteEngine On
RewriteRule ^posts/([0-9])/(edit|delete)$ /index.php?page=posts&postId=$1&action=$2

Obvious, mod_rewrite must be enabled by your hostingprovider ;)



回答6:

Using mod_rewrite this can be achieved very easily.



回答7:

I am poor at this but i do know you can redirect urls using apache mod_rewrite and by touching config files. From what i remember htaccess can be used to redirect. Then internally when the user hits http://stackoverflow.com/posts/1807421/edit it can use your page http://stackoverflow.com/edit.php?p=1807421 instead or whatever you want.



回答8:

You could use htaccess + write an URI parser class.