如何解决.htaccess 在条件
我正在我的项目中尝试在 .htaccess
的帮助下实现干净的 URL。
当我使用多个条件字符串来实现一个条件时,我得到了一个 404
,例如 keyword1/keyword2/param
所有其他条件,如 RewriteRule ^home index.PHP [L,NC]
工作正常
我的文件结构是这样的
/subdirectory/
|-.htaccess
|-index.PHP
|-edit-user.PHP
|-new-user.PHP
我想要的干净网址是
mysite.com/subdirectory/user/edit/10
它应该翻译成
mysite.com/subdirectory/edit-user.PHP?id=10
到目前为止我尝试过的一些最接近的解决方案(但没有运气)
RewriteRule (.*)/user/edit/([0-9]+)$ edit-user?id=$1 [L,NC]
RewriteBase /user/
RewriteRule ^user\/edit\/([0-9]+)$ edit-user.PHP?id=$1 [L,NC]
非常感谢任何建议。
解决方法
RewriteRule (.*)/user/edit/([0-9]+)$ edit-user?id=$1 [L,NC]
由于 .htaccess
文件位于 /subdirectory
内,因此您需要像这样编写指令:
RewriteRule ^user/edit/(\d+)$ edit-user.php?id=$1 [L]
并删除所有 RewriteBase
指令。
\d
只是 [0-9]
的简写字符类。
RewriteRule
pattern 匹配相对 URL 路径(无斜杠前缀)。这是相对于包含 .htaccess
文件的目录。您还缺少要重写的文件名的 .php
扩展名。除非您确实希望允许大小写混合的请求,否则您不需要 NC
标志,但这会让您面临需要以其他方式解决的潜在“重复内容”。
RewriteBase /user/
RewriteRule ^user\/edit\/([0-9]+)$ edit-user.php?id=$1 [L,NC]
实际上,您在这里非常接近,但是 RewriteBase
指令会导致此操作失败。 RewriteBase
指令的唯一目的是覆盖添加回相对路径 substitutions 的目录前缀。 RewriteBase
指令设置添加回来的“URL 路径”(与文件系统路径相对)。
因此,在此示例中,RewriteBase /user/
会导致请求被重写为 /user/edit-user.php?id=10
(相对于根),根据您发布的文件结构,这显然是错误的。
如果没有定义 RewriteBase
,则会添加回目录前缀,这导致重写相对于包含 .htaccess
文件的目录。
此外,由于正则表达式没有斜杠分隔符,因此无需反斜杠转义斜杠。 (围绕参数的空格是分隔符。)
所有其他条件,如 RewriteRule ^home index.php [L,NC]
工作正常
小心这一点,因为这也将匹配 /homeanything
和 /home/something
等
终于发现了问题。
我的.htaccess
是
RewriteRule ^home index.php [L,NC] RewriteRule ^([^\.]+)$ $1.php [NC]
RewriteRule ^user/edit/(\d+)$ edit-user?id=$1 [L]
(第一行添加 .php
到任何输入,第二行转换我需要的所需 URL)
这里发生的事情是,当我尝试访问 URL mysite.com/subdirectory/user/edit/10
第一条规则将其转换为 mysite.com/subdirectory/user/edit/10.php
而不是 mysite.com/subdirectory/edit-user.php?id=10
这会导致 404 错误。
现在我改变了顺序,新的 .htaccess 文件看起来像,
RewriteRule ^admin/edit/(\d+)$ edit-admin.php?aid=$1 [L]
RewriteRule ^([^\.]+)$ $1.php [NC]
因此,当一个 URL 进入时,它会在与最后一条规则(附加 .php)匹配之前检查所有其他规则并转换为所需的结果。
经验教训:顺序在 .htaccess 中很重要
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。