我对 url 中使用的冒号有疑问
这是我的网址
http://localhost/1:1
这是我的 htaccess
RewriteEngine On
RewriteRule ^/(.*):(.*) index.php/$1:$2
此错误显示禁止您无权访问此服务器上的 /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>
答案1
这里有几个问题...
在每个目录
.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
。
当在服务器(或者虚拟主机)上下文(而不是.htaccess
)你做需要斜线前缀(在图案和代换字符串)。例如:
# In a "server" (or "virtualhost") context,
# not ".htaccess" (or "<Directory>" section in the server config)
RewriteEngine On
# Internally rewrite "/1:1" to path-info on "index.php"
RewriteRule ^/\d+:\d+$ /index.php$0 [L]
反向$0
引用包含由RewriteRule
图案。这包括斜线前缀(当用于服务器上下文),这就是为什么在代换细绳。
更新:
我做了更改,请再看一遍我的问题,我输入的正确
<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>
您似乎没有做出任何更改;至少没有在正确的部分?如上所述,这些指令需要直接添加到容器中<VirtualHost>
(您已发布)。它们不能添加到.htaccess
Windows 操作系统上的文件中 - 它们根本不起作用,您会收到所述的 403 Forbidden 响应。
上面的内容应该这样写:
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
DocumentRoot "${INSTALL_DIR}/www"
# Enable the rewrite engine in a virtualhost context
RewriteEngine On
# Internally rewrite "/1:1" to path-info on "index.php"
RewriteRule ^/\d+:\d+$ /index.php$0 [L]
<Directory "${INSTALL_DIR}/www/">
Options -Indexes -Includes +FollowSymLinks -MultiViews
AllowOverride all
Require all granted
</Directory>
</VirtualHost>
您需要重新启动 Apache 以使这些更改生效。(与.htaccess
在运行时解释的文件不同。)
但是,您还有哪些其他指令,.htaccess
以及您的其他 URL 是如何路由的?您在评论中发布了以下指令:
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
这会路由 URL,这与您在问题中请求的 URL 完全不同。在您的问题中,您将 URL 路径作为附加路径信息传递给index.php
。但是,在此指令中,您将 URL 作为查询字符串的一部分传递?它们有何关系?为什么它们不同?您显然需要按照“MVC 应用程序”期望的方式传递 URL。