簡體   English   中英

Laravel如何處理網址重寫?

[英]How Laravel handle url-rewriting?

僅出於好奇... Laravel框架如何捕獲“獲取”參數?

我剛剛打開他們的.htaccess文件 ,發現下面的內容:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>

請注意,在這一部分中,根本沒有任何參數傳遞給index.php

# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

最常見的情況是:

RewriteRule ^(.*)$ index.php?getparams=$1 [L]

使用RewriteRule ,有兩種主要的操作形式:內部和外部重定向。

外部

使用[R]標志的外部重定向將告訴您的瀏覽器重定向到新的URL,例如

RewriteRule ^foo bar/ [L,R=PERMANENT]

會告訴瀏覽器“位於/ foo的內容實際上可以在/ bar上找到,請重定向用戶”。 然后,瀏覽器對/ bar發出新請求,該請求從頭開始處理。 使用此方法時,通常需要使用QSA標志來保留查詢字符串參數。

RewriteRule ^foo bar/ [L,R=301,QSA]

如果它們沒有傳遞給新請求,則它們將丟失。

內部

另一方面,內部重定向不將有關重定向的任何信息發送回瀏覽器。 他們只是在告訴Apache任何與URL匹配的請求都應由給定文件處理。 所以

RewriteRule ^ index.php [L]

Laravel示例中的命令指示Apache所有請求均應由index.php腳本(Laravel前端控制器)處理。 作為原始請求的一部分,仍然可以在PHP中訪問查詢字符串,但尚未更改。

然后Laravel本身使用PHP超全局變量( $_GET$_POST等)填充Illuminate\\HTTP\\Request對象,然后通常在整個應用程序中使用該對象來封裝對原始請求的訪問,例如

# HTTP Request = /?foo=bar
echo $request->get('foo');
// "bar"

這不是Laravel特有的,而是任何PHP框架如何處理它。

首先,不需要將查詢字符串添加到index.php ,因為它已經隱式存在。 參見RewriteRule

...
修改查詢字符串

默認情況下,查詢字符串不變。 但是,您可以在包含查詢字符串部分的替換字符串中創建URL。 只需在替換字符串中使用問號來表示應將以下文本重新插入到查詢字符串中。 當您要刪除現有的查詢字符串時,只需用問號結束替換字符串。 要組合新舊查詢字符串,請使用[QSA]標志。

@iainn已經提到了超全局變量$_GET$_POST 還有$_SERVER ,其中包含REQUEST_URIPATH_INFO 有了這些,您就可以獲取所請求的URL,而無需將其作為查詢字符串的一部分顯式傳遞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM