Php

使用冒號作為 url htaccess http://localhost/1:1

  • July 16, 2021

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

這裡有幾個問題…

  1. 在每個目錄的上下文中,模式.htaccess匹配的 URL 路徑從不以斜杠開頭,因此正則表達式永遠不會匹配,並且指令什麼也不做。因此,模式需要是- 沒有斜線前綴。RewriteRule ^/(.*):(.*)``RewriteRule ^(.*):(.*)
  • 但是,這個正則表達式非常通用,很可能匹配太多。如果您期待表單的請求/1:1,即。/<number>:<number>然後使用更具體的正則表達式,例如。^\d+:\d+$
  1. 由於您收到 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。

引用自:https://serverfault.com/questions/1069406