将所有请求重定向到单个页面

时间:2016-09-26 21:20:21

标签: php html redirect server webserver

我有一个美食博客网站,其中有许多帖子存储在数据库中。当有人点击指向帖子的链接时,网站会在数据库中搜索帖子并将其显示在模板中。我没有为每个帖子存储HTML文件。

现在,我通过处理404错误(由于请求的HTML文件不存在而关闭)并从那里搜索数据库来实现。我知道这不对。

如何设置我的Web服务器(在Raspberry Pi上运行的Apache),以便所有请求都转到一个页面,这将进行搜索并将用户发送到正确的页面?这是正确的做法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用放在名为.htaccess的网站根目录中并使用mod_rewrite模块的文件来执行此操作。您需要确保在Apache配置中启用.htaccess和mod_rewrite。但一旦启用,您可以执行以下操作:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]

这将重写任何不会引用index.php的实际现有文件或目录的URL,您可以使用它来处理请求。

例如,如果有人访问http://yourdomain.com/article,则该路径将在内部重写为index.php?path=article,您可以使用$_GET['path']访问该路径。

注意:如果你想通过单个入口点逐字服务,你可以删除两个中间行,并将通过那里发送所有内容。包括图像,脚本,CSS等,这通常不是你想要的。

答案 1 :(得分:0)

您的公共根目录中需要正确的.htaccess规则,并且需要启用apache2 mod_rewrite模块。

在Ubuntu上,您可以使用以下命令启用它:

sudo a2enmod rewrite

您的.htaccess文件可能如下所示:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>