我有一个美食博客网站,其中有许多帖子存储在数据库中。当有人点击指向帖子的链接时,网站会在数据库中搜索帖子并将其显示在模板中。我没有为每个帖子存储HTML文件。
现在,我通过处理404错误(由于请求的HTML文件不存在而关闭)并从那里搜索数据库来实现。我知道这不对。
如何设置我的Web服务器(在Raspberry Pi上运行的Apache),以便所有请求都转到一个页面,这将进行搜索并将用户发送到正确的页面?这是正确的做法吗?
答案 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>