.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 中很重要

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...