Apache:在查询参数后从 URL 中删除 index.php

Apache:在查询参数后从 URL 中删除 index.php

我想index.php从我的 URL 中删除查询参数。

这是我的网址:

http://127.0.0.1/user/report?user=USERNAME

我已删除查询参数并使用以下方法将其转换为 Pretty Url:

    RewriteCond %{QUERY_STRING} !user=
    RewriteRule ^([a-zA-Z0-9\-]+)/(.*)$ $2?user=$1 [L,QSA]
    RewriteRule ^([a-zA-Z0-9\-]+)$ ?user=$1 [L,QSA]

现在,我的 URL 如下所示:

http://127.0.0.1/user/report/USERNAME

因此所有对此 URL 的请求都将指向我的项目的入口脚本,即web/index.php

当我使用以下路线获取数据时,它有效:

http://127.0.0.1/user/report/Default/index.php/api/registration/user-registrations/

但是当我index.php从 URL 中删除并像下面这样访问它时,它会抛出 404。

http://127.0.0.1/user/report/Default/api/registration/user-registrations/

仅供参考,我正在使用 Symfony 来安排我的所有路线。

我已经陷入这个问题两周了。请帮忙。

答案1

问题在于您没有规则将没有 index.php 的 URL 重写为带有 index.php 的 URL!

正如你所说,有效的 URL(#1)是:

http://127.0.0.1/user/report/Default/index.php/api/registration/user-registrations/

您想要使用的 URL(#2)是:

http://127.0.0.1/user/report/Default/api/registration/user-registrations/

重写的目的是帮助服务器理解 URL 的含义,以便服务器能够正确地提供 URL。因此,您需要一条规则将 #2 重写为 #1。

像这样:

RewriteRule ^(/user/report/Default)/(.*)$ $1/index.php/$2 [L,QSA]

请注意,我还没有测试过,所以你可能需要做一些实验。你可能需要删除“L”标志。

编辑

下面是一个更完整的示例,展示了如何使用 RewriteRules 来构建您想要的内容,因为它们按顺序运行。

我修改了您的重写规则 - 不再使用 a-zA-Z0-9-,因为这样无法匹配 index.php,我只匹配 URL 的最后一部分。正则表达式语法很棘手,值得掌握,但我知道这是一个很难的主题。

    RewriteCond %{QUERY_STRING} !user= 
    RewriteRule ^(.*)/([^/]*)/?$ /index.php$1?user=$2 [QSA,L]

这种事应该可行。

(对于那些刚刚看到这个回复的人,我直接向提问者重申了规则,以澄清设置。)

相关内容