使用冒號作為 url htaccess http://localhost/1:1
我對 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
您確實需要斜杠前綴(在模式和替換字元串上)。例如:# 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>
容器(您已發布)中。它們不能被添加到.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 路徑作為附加路徑資訊傳遞給
index.php
. 但是,在此指令中,您將 URL 作為查詢字元串的一部分傳遞?這些有什麼關係?為什麼它們不同?您顯然需要以“MVC 應用程序”所期望的方式傳遞 URL。