【问题标题】:Redirect all requests to single page将所有请求重定向到单个页面
【发布时间】:2023-04-09 06:11:01
【问题描述】:

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

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

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

【问题讨论】:

标签: php html redirect server webserver


【解决方案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]

这会将任何不引用实际现有文件或目录的 URL 重写为您可用于处理请求的 index.php

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

注意:如果您想通过该单一入口点提供所有内容,您可以删除中间的两条线,然后将所有内容发送到那里。包括图片、脚本、CSS 等,这些通常不是你想要的。

【讨论】:

    【解决方案2】:

    您需要在您的公共根目录中使用适当的 .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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-18
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 2014-04-07
      相关资源
      最近更新 更多