處理斜線結尾的網址(Handling trailing slash in URLs)
Yii 預設網址沒有斜線,如果使用結尾有斜線的網址,會導致 404 找不到頁面。
如果選定結尾有或者沒有斜線,並且在另一種狀況時使用 301 重新導向,而不是找不到頁面,一般來說是比較好的設計。
舉例來說,
/hello/world - 200
/hello/world/ - 301 重導向至 /hello/world
1. 使用 UrlNormalizer
從 Yii 2.0.10 開始,有了UrlNormalizer
類別,可以簡單的處理斜線結尾或者無斜線結尾的網址。
請參考 Yii 官方教學 URL normalization 章節。
2. 透過伺服器 config 重新導向
除了使用 PHP 程式,我們也可以使用伺服器來重新導向。
3. 透過 nginx
導向至尾端沒有斜線的網址:
location / {
rewrite ^(.*)/$ $1 permanent;
try_files $uri $uri/ /index.php?$args;
}
導向至尾端有斜線的網址:
location / {
rewrite ^(.*[^/])$ $1/ permanent;
try_files $uri $uri/ /index.php?$args;
}
4. 透過 Apache
導向至尾端沒有斜線的網址:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
導向至尾端有斜線的網址:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ /$1/ [L,R=301]