[英]301 redirect to url without extension
我試圖設置URL中沒有文件擴展名的網站。
我所有的頁面都是php。
我所有的菜單鏈接都刪除了擴展名,例如...
<a href="page1">page 1</a>
<a href="page2">page 2</a>
<a href="page3">page 3</a>
這些鏈接都可以正常工作。
但我現在嘗試設置一個.htaccess文件,以從其他外部鏈接(例如Google)進行301重定向。
在我的htaccess文件中,我有...
Redirect 301 /page1.php https://www.mysite.co.uk/page1
但這會使來自Google的鏈接命中未找到的404頁面-不會轉到應有的頁面。
我在做什么錯,如何才能使這些301重定向正常工作?
編輯
為了嘗試調試,我更改了htaccess文件。 我的完整htaccess代碼現在是這個...
DirectoryIndex index.php
CheckSpelling Off
FileETag none
ServerSignature Off
Options +FollowSymlinks
Redirect 301 https://www.mysite.co.uk/page1.php https://www.mysite.co.uk/page1
Redirect 301 https://mysite.co.uk/page1.php https://www.mysite.co.uk/page1
Redirect 301 http://www.mysite.co.uk/page1.php https://www.mysite.co.uk/page1
Redirect 301 http://mysite.co.uk/page1.php https://www.mysite.co.uk/page1
Redirect 301 www.mysite.co.uk/page1.php https://www.mysite.co.uk/page1
現在,如果我點擊菜單鏈接,我將...
https://www.mysite.co.uk/page1
如果我在瀏覽器的地址欄中輸入https://www.mysite.co.uk/page1 ,它將正確加載頁面。
但是,如果我點擊Google的鏈接,它的結尾就是...
http://www.mysite.co.uk/page1.php
怎么會這樣?!
我已經在htaccess文件中介紹了所有可能的網址,那么,該Google鏈接如何以.php結尾轉到http://文件?
我假設您當前正在使用Apache的MultiViews
(mod_negotiation的一部分)將沒有文件擴展名(例如/page1
)的URL映射到具有文件擴展名(例如/page1.php
)的相應/page1.php
因為您的其他內容都沒有.htaccess
文件執行此操作。
MultiViews使用內部子請求映射文件擴展名,因此您需要使用mod_rewrite( RewriteRule
),而不是mod_alias( Redirect
)來重定向到無擴展名的URL,因為您只想重定向直接請求,而不是子請求,因此可以通過Redirect
來區分。
Redirect 301 https://www.mysite.co.uk/page1.php https://www.mysite.co.uk/page1 Redirect 301 https://mysite.co.uk/page1.php https://www.mysite.co.uk/page1 Redirect 301 http://www.mysite.co.uk/page1.php https://www.mysite.co.uk/page1 Redirect 301 http://mysite.co.uk/page1.php https://www.mysite.co.uk/page1 Redirect 301 www.mysite.co.uk/page1.php https://www.mysite.co.uk/page1
您需要將上面的Redirect
指令更改為類似於以下內容的內容。 (順便說一下,上述指令實際上並沒有做任何事情,因為URL路徑已聲明,例如https://www.mysite.co.uk/page1.php
永遠不會匹配-這必須是相對於根的URL-路徑。)
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.*)\.php$ https://www.example.com/$1 [R=302,L]
檢查REDIRECT_STATUS
環境變量的RewriteCond
指令確保我們僅重定向初始/直接請求。
請注意,這目前是臨時(302)重定向。 僅在確認一切正常后,才能將其更改為301
(永久)重定向。 (301被瀏覽器硬緩存,因此可能使測試有問題。)
您也可以嘗試使用以下單行代碼(不帶RewriteCond
指令):
RewriteRule ^(.*)\.php$ https://www.example.com/$1 [NS,R=302,L]
請注意,添加了NS
( nosubreq
)標志,以防止針對內部子請求處理指令。
更新:嘗試禁用MultiViews
並使用mod_rewrite代替所有操作(可能建議這樣做)。 例如:
Options +FollowSymLinks -MultiViews
RewriteEngine On
# Remove .php file extension with an external redirect
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.*)\.php$ https://www.example.com/$1 [R=302,L]
# Append the .php extension with an internal rewrite
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^.])+$ $1.php [L]
附加文件擴展名的偽指令假定現有URL尚未包含點。 即。 僅當將文件擴展名應用於URL時才會出現點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.