Apache .htaccess在条件上有多个斜杠

Apache .htaccess在条件上有多个斜杠,apache,.htaccess,mod-rewrite,url-rewriting,apache-config,Apache,.htaccess,Mod Rewrite,Url Rewriting,Apache Config,我正试图在项目中借助.htaccess实现干净的URL 当我用多个条件字符串来实现一个条件时,我得到了一个404,比如keyword1/keyword2/param 所有其他条件,如RewriteRule^home index.php[L,NC]都可以正常工作 我的文件结构是什么样的 /subdirectory/ |-.htaccess |-index.php |-edit-user.php |-ne

我正试图在项目中借助
.htaccess
实现干净的URL

当我用多个条件字符串来实现一个条件时,我得到了一个
404
,比如
keyword1/keyword2/param

所有其他条件,如
RewriteRule^home index.php[L,NC]
都可以正常工作

我的文件结构是什么样的

/subdirectory/
            |-.htaccess
            |-index.php
            |-edit-user.php
            |-new-user.php
我想要的干净url是

mysite.com/subdirectory/user/edit/10
它应该被翻译成

mysite.com/subdirectory/edit-user.php?id=10
到目前为止,我尝试了一些最接近的解决方案(但没有成功)

非常感谢您的任何建议

由于
.htaccess
文件位于
/子目录
内,因此您需要编写如下指令:

RewriteRule ^user/edit/(\d+)$ edit-user.php?id=$1 [L]
并删除任何
RewriteBase
指令

\d
只是
[0-9]
的简写字符类

RewriteRule
模式与相对URL路径匹配(无斜杠前缀)。它相对于包含
.htaccess
文件的目录。您还缺少要重写的文件名的扩展名
.php
。您不需要
NC
标志,除非您确实希望允许混合案例请求,但这会导致潜在的“重复内容”,需要以其他方式解决

实际上,您离这里很近,但是
RewriteBase
指令会导致此操作失败。
RewriteBase
指令的唯一目的是重写在相对路径替换中添加回来的目录前缀。
RewriteBase
指令设置添加回的“URL路径”(与文件系统路径相反)

因此,在本例中,
RewriteBase/user/
将导致请求被重写为
/user/edit user.php?id=10
(相对于根),根据您发布的文件结构,这显然是错误的

如果未定义
RewriteBase
,则会重新添加目录前缀,这会导致重写相对于包含
.htaccess
文件的目录

此外,由于正则表达式没有斜杠分隔符,因此不需要反斜杠转义斜杠。(围绕参数的空格是分隔符。)

所有其他条件,如
RewriteRule^home index.php[L,NC]
都可以正常工作


注意这一点,因为这也将匹配
/home anything
/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进入时,它将在与最后一个规则(appends.php)匹配之前检查所有其他规则,并转换为所需的结果


经验教训:订单在.htaccess中非常重要

首先,感谢您花时间非常清晰地回答我的问题。不幸的是,我的.htaccess代码在这里不起作用<代码>选项+FollowSymLinks-多视图
重写引擎打开
重写条件%{REQUEST_FILENAME}-f
重写cond%{REQUEST_FILENAME}-d
RewriteRule^home index.php[L,NC]
RewriteRule^([^\.]+)$$1.php[NC]
RewriteRule^user/edit/(\d+)$edit user?id=$1[L]
禁止查看.htaccess文件
订单允许,拒绝
deny from all
#阻止目录列表
选项所有-索引
注意:我在路由目录中有一个.htaccess文件,其中包含添加.php扩展名的基本代码,阻止访问.htaccess文件并阻止目录列表(与上述代码中给出的方式相同)。很抱歉在前面的评论中设置了格式,因为我找不到更好的方法。
RewriteBase /user/
RewriteRule ^user\/edit\/([0-9]+)$ edit-user.php?id=$1 [L,NC]
RewriteRule ^home  index.php [L,NC] RewriteRule ^([^\.]+)$ $1.php [NC] 
RewriteRule ^user/edit/(\d+)$ edit-user?id=$1 [L] 
RewriteRule ^admin/edit/(\d+)$ edit-admin.php?aid=$1 [L]
RewriteRule ^([^\.]+)$ $1.php [NC]