我想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]
这种事应该可行。
(对于那些刚刚看到这个回复的人,我直接向提问者重申了规则,以澄清设置。)