簡體   English   中英

301重定向到沒有擴展名的網址

[英]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]

請注意,添加了NSnosubreq )標志,以防止針對內部子請求處理指令。


更新:嘗試禁用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.

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