使用冒号作为 url htaccess http://localhost/1:1

使用冒号作为 url htaccess http://localhost/1:1

我对 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

这里有几个问题...

  1. 在每个目录.htaccess上下文中,匹配的 URL 路径RewriteRule 图案永远不会以斜线开头,因此正则表达式^/(.*):(.*)永远不会匹配,并且指令不会执行任何操作。因此,RewriteRule 图案需要是^(.*):(.*)- 没有斜线前缀。

    • 然而,这个正则表达式非常一般的并且很可能匹配过多。如果您期望请求的形式为/1:1,即。/<number>:<number>则使用更具体的正则表达式,例如。^\d+:\d+$
  2. 由于您收到的是 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>(您已发布)。它们不能添加到.htaccessWindows 操作系统上的文件中 - 它们根本不起作用,您会收到所述的 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。

相关内容