我对 url 中使用的冒号有疑问
这是我的网址
http://localhost/1:1
这是我的 htaccess
RewriteEngine On
RewriteRule ^/(.*):(.*) index.php/$1:$2
此错误显示 Forbidden 您无权访问此服务器上的 /1:1。
# Virtual Hosts
#
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
DocumentRoot "${INSTALL_DIR}/www"
<Directory "${INSTALL_DIR}/www/">
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride all
Order Allow,Deny
Allow from all
</Directory>
</VirtualHost>
这里有几个问题...
在每个目录的上下文中,模式
.htaccess
匹配的 URL 路径从不以斜杠开头,因此正则表达式永远不会匹配,并且指令什么也不做。因此,模式需要是- 没有斜线前缀。RewriteRule
^/(.*):(.*)
RewriteRule
^(.*):(.*)
/1:1
,即。/<number>:<number>
然后使用更具体的正则表达式,例如。^\d+:\d+$
由于您收到 403 Forbidden(而不是 404 Not Found),我假设您在 Windows 服务器上。这里的“问题”是
:
(冒号)不是 Windows 文件名中的有效字符。这是一个问题,.htaccess
因为请求在处理(和 mod_rewrite)之前被映射到文件系统.htaccess
- 此时会触发 403。您需要改写主服务器配置(或 VirtualHost 容器)中的请求 - 这发生在请求映射到文件系统之前。所以,你要做什么......重写包含冒号的请求,
.htaccess
在 Windows 服务器上使用是不可能的。您可以在 Linux 上执行此操作(允许文件名中使用冒号)或在 Windows 上的主服务器配置(服务器或虚拟主机上下文)中执行此操作,但不能在.htaccess
.在服务器(或virtualhost)上下文(而不是 )中使用 mod_rewrite 时,
.htaccess
您确实需要斜杠前缀(在模式和替换字符串上)。例如:$0
反向引用包含由RewriteRule
pattern捕获的整个 URL 路径。这包括斜杠前缀(在服务器上下文中使用时),这就是为什么在替换字符串中省略斜杠分隔符的原因。更新:
您似乎没有进行任何更改;至少不在正确的部分?如上所述,这些指令需要直接添加到
<VirtualHost>
容器(您已发布)中。它们不能被添加到.htaccess
Windows 操作系统上的文件中——它们根本不会做任何事情,你会得到如前所述的 403 Forbidden 响应。上面应该这样写:
您需要重新启动 Apache 才能使这些更改生效。(与
.htaccess
在运行时解释的文件不同。)但是,您还有哪些其他指令
.htaccess
以及您的其他 URL 是如何路由的?您在评论中发布了以下指令:这路由 URL 与您在问题中请求的完全不同。在您的问题中,您将 URL 路径作为附加路径信息传递给
index.php
. 但是,在此指令中,您将 URL 作为查询字符串的一部分传递?这些有什么关系?为什么它们不同?您显然需要以“MVC 应用程序”所期望的方式传递 URL。