我应该怎么做才能使用 .htaccess 为我的特定场景制作漂亮的 URL?

What should I do to make the pretty URLs using .htaccess for my specific scenario?

这是我的完整案例:

  1. mvcframework目录里面/var/www/html/dir.
  2. mvcframework 包含一个 public 目录,其中 index.php 作为前端加载程序。
  3. 我正在使用以下代码在 public 目录中创建一个 .htaccess 文件:
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule  ^(.+)$ index.php? [QSA,L]
</IfModule>
  1. 我正在通过设置为指向 public 文件夹的虚拟主机 url mvcframe.local 访问此文件:
<VirtualHost 127.0.0.3:80>
    ServerName mvcframe.local
    DocumentRoot /var/www/html/mvcframework/public

    <Directory /var/www/html/mvcframework>
        Options -Indexes +FollowSymLinks
        AllowOverride All
    </Directory>
    ErrorLog /var/www/html/mvcframework/mvc-error.log
    CustomLog /var/www/html/mvcframework/mvc-access.log combined
</VirtualHost>

  1. 当我访问 http://mvcframe.local or http://mvcframe.local/ 时,它会在 public 文件夹 index.php 中输出 index.php 内容。

  2. 当我访问http://mvcframe.local/?posts/hello时,它输出:

Requested URL = posts/hello
  1. 但是当我访问 http://mvcframe.local/posts/hello 删除 ? 时,它给出:
Not Found
The requested URL was not found on this server.

Apache/2.4.41 (Ubuntu) Server at mvcframe.local Port 80

我想找出解决方案,搜索了 2 个小时,但仍然没有找到解决方案。

好吧,在胡乱阅读 .htaccess 教程几个小时后,我终于明白了我的错误。首先,here 是帮助我理解错误的视频。

这是我的解决方案:

<IfModule mod_rewrite.c>
  Options -Multiviews
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule  ^(.+)$ index.php? [QSA,L]
</IfModule>

首先,我正在检查 mod_rewrite 是否已启用。然后提供一些选项。然后打开启用重写规则所必需的 RewriteEngine。然后为正在提供的任何查询提供 [If no directory] ​​和 [If not file] 的重写条件,为此我重写了规则,基本上告诉它检查所有不以扩展名“。”结尾的字符串,简单地将它们全部引导至 index.php?$1。

基本上任何有 mvcframe.local/something_here/some_here/... 的东西都会自动变成 mvcframe.local/index.php?something_here/some_here

对于我的设置,index.php 是前端加载程序,因此所有内容都必须通过此文件。