我应该怎么做才能使用 .htaccess 为我的特定场景制作漂亮的 URL?
What should I do to make the pretty URLs using .htaccess for my specific scenario?
这是我的完整案例:
- mvcframework目录里面/var/www/html/dir.
- mvcframework 包含一个 public 目录,其中 index.php 作为前端加载程序。
- 我正在使用以下代码在 public 目录中创建一个 .htaccess 文件:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php? [QSA,L]
</IfModule>
- 我正在通过设置为指向 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>
当我访问 http://mvcframe.local or http://mvcframe.local/ 时,它会在 public 文件夹 index.php 中输出 index.php 内容。
当我访问http://mvcframe.local/?posts/hello时,它输出:
Requested URL = posts/hello
- 但是当我访问 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 是前端加载程序,因此所有内容都必须通过此文件。
这是我的完整案例:
- mvcframework目录里面/var/www/html/dir.
- mvcframework 包含一个 public 目录,其中 index.php 作为前端加载程序。
- 我正在使用以下代码在 public 目录中创建一个 .htaccess 文件:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php? [QSA,L]
</IfModule>
- 我正在通过设置为指向 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>
当我访问 http://mvcframe.local or http://mvcframe.local/ 时,它会在 public 文件夹 index.php 中输出 index.php 内容。
当我访问http://mvcframe.local/?posts/hello时,它输出:
Requested URL = posts/hello
- 但是当我访问 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 是前端加载程序,因此所有内容都必须通过此文件。