AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1069406
Accepted
amir shariflou
amir shariflou
Asked: 2021-07-13 13:06:12 +0800 CST2021-07-13 13:06:12 +0800 CST 2021-07-13 13:06:12 +0800 CST

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

  • 772

我对 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>
php url .htaccess redirect localhost
  • 1 1 个回答
  • 196 Views

1 个回答

  • Voted
  1. Best Answer
    MrWhite
    2021-07-13T14:12:13+08:002021-07-13T14:12:13+08:00

    这里有几个问题...

    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.

    在服务器(或virtualhost)上下文(而不是 )中使用 mod_rewrite 时,.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 pattern捕获的整个 URL 路径。这包括斜杠前缀(在服务器上下文中使用时),这就是为什么在替换字符串中省略斜杠分隔符的原因。


    更新:

    我进行了更改,请再看一下我的问题,看看,我输入正确

    <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 路径作为附加路径信息传递给index.php. 但是,在此指令中,您将 URL 作为查询字符串的一部分传递?这些有什么关系?为什么它们不同?您显然需要以“MVC 应用程序”所期望的方式传递 URL。

    • 1

相关问题

  • 用户特定的 Php.ini 当 php 作为模块运行时?

  • 使 php mail() 函数在 ubuntu-server 上工作的步骤是什么?

  • Web 服务器和数据库服务器位于完全不同的位置

  • PHP 作为 CGI 还是 Apache 模块?

  • 通过 VPN 连接什么是远程服务器 IP?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve