簡體   English   中英

.htaccess Rewriterule 重定向到同一域上的 URL

[英].htaccess Rewriterule redirecting to a URL on the same domain

我正在嘗試將用戶重定向到特定的 URL。 我想創建 .htaccess 重寫規則來完成這個。

我想要這些:

https://example.com/career_by_education
https://example.com/international_careers
https://example.com/major_careers
https://example.com/career

轉移到:

https://example.com/career_by_education/careers-by-educational-level.php
https://example.com/international_careers/international_careers.php
https://example.com/major_careers/academic_major_careers.php
https://example.com/career/career.php

我已經嘗試了許多重寫規則的變體來讓它工作,如果我想讓它重定向到不同的域,我就成功了。

例如,以下 (in.htaccss):

RewriteRule career_by_education   https://example2.com/career_by_education/careers-by-educational-level.php [L,R]
RewriteRule international_careers   https:/example2.com/international_careers/international_careers.php [L,R]
RewriteRule major_careers   https://example2.com/major_careers/academic_major_careers.php [L,R]
RewriteRule career   https://example2.com/career/career.php [L,R]

成功轉移到(分別):

https://example2.com/career_by_education/careers-by-educational-level.php
https://example2.com/international_careers/international_careers.php
https://example2.com/major_careers/academic_major_careers.php
https://example2.com/career/career.php

但我希望重定向到同一個域(example.com),所以我嘗試了這個(按此順序):

RewriteRule career_by_education   https://example.com/career_by_education/careers-by-educational-level.php [L,R]
RewriteRule international_careers  https://example.com/international_careers/international_careers.php [L,R]
RewriteRule major_careers   https://example.com/major_careers/academic_major_careers.php [L,R]
RewriteRule career   https://example.com/career/career.php [L,R]

當我在瀏覽器中輸入其中任何一個時:

https://example.com/career_by_education
https://example.com/international_careers
https://example.com/major_careers

我總是得到這個 URL:

https://example.com/career/career.php

我試圖將 RewriteRules 的順序反轉為:

RewriteRule career   https://example.com/career/career.php [L,R]
RewriteRule major_careers   https://example.com/major_careers/academic_major_careers.php [L,R]
RewriteRule international_careers  https://example.com/international_careers/international_careers.php [L,R]
RewriteRule career_by_education   https://example.com/career_by_education/careers-by-educational-level.php [L,R]

但結果 URL 始終是:

https://example.com/career/career.php

我還嘗試刪除完整的 URL 進行替換,如下所示:

RewriteRule career_by_education /career_by_education/careers-by-educational-level.php [L,R]
RewriteRule international_careers /international_careers/international_careers.php [L,R]
RewriteRule major_careers /major_careers/academic_major_careers.php [L,R]
RewriteRule career /career/career.php [L,R]

但結果總是重定向到這個 URL:

https://example.com/career/career.php

我嘗試了不同的表達方式,看看它是否可行:

RewriteRule ^/career http://consul64.wwwaz1-ts107.a2hosted.com/career/career.php [L,R]
RewriteRule ^/major_careers http://consul64.wwwaz1-ts107.a2hosted.com/major_careers/academic_major_careers.php [L,R]
RewriteRule ^/international_careers http://consul64.wwwaz1-ts107.a2hosted.com/international_careers/international_careers.php [L,R]
RewriteRule ^/career_by_education http://consul64.wwwaz1-ts107.a2hosted.com/career_by_education/careers-by-educational-level.php [L,R]

這些都會導致“403 Forbidden”錯誤 - 從命令行我確保我在根目錄中有一個“index.php”,並且權限是正確的,具有以下內容:

chmod 644 ~/public_html/.htaccess
chmod 755 ~/public_html

然后我嘗試了這些:

RewriteRule .*(?=major_careers) http://consul64.wwwaz1-ts107.a2hosted.com/major_careers/academic_major_careers.php [L,R]
RewriteRule .*(?=international_careers) http://consul64.wwwaz1-ts107.a2hosted.com/international_careers/international_careers.php [L,R]
RewriteRule .*(?=career_by_education) http://consul64.wwwaz1-ts107.a2hosted.com/career_by_education/careers-by-educational-level.php [L,R]
RewriteRule  .*(?=career) http://consul64.wwwaz1-ts107.a2hosted.com/career/career.php [L,R]

結果 URL 總是:

https://example.com/career/career.php

我不明白為什么該模式在重定向到外部 URL 時似乎有效,但如果重定向到同一域中的 URL 則不起作用。

任何人都可以幫助指導我嗎?

 RewriteRule career_by_education /career_by_education/careers-by-educational-level.php [L,R] RewriteRule international_careers /international_careers/international_careers.php [L,R] RewriteRule major_careers /major_careers/academic_major_careers.php [L,R] RewriteRule career /career/career.php [L,R]

RewriteRule指令的第一個參數(模式)是一個正則表達式。 這不是“精確的字符串匹配”。 這些規則的問題是該模式也匹配重定向的 URL,因此會導致無休止的“重定向循環”,因為“正則表達式” career_by_education匹配 URL 路徑中任何位置的字符串。

你 state 它總是重定向到/career/career.php (上面的最后一條規則),但是對於發布的規則來說這是不可能的 - 由於上面提到的重定向循環。 但是,如果您顛倒這些指令(您說您也嘗試過),就會發生這種情況,因為第一個規則(僅匹配career )將始終匹配 - 但同樣,這是一個重定向循環。

旁白:根據您的服務器配置,它可能不會觸發重定向循環,例如。 如果對.php文件的請求被代理到 CGI PHP 引擎。

您需要更具體地使用正則表達式並僅匹配指定的 URL。 IE。 您需要在正則表達式中包含錨點,並且匹配career_by_education而不是任何地方career_by_education

例如:

RewriteRule ^career_by_education$ /career_by_education/careers-by-educational-level.php [L,R]
RewriteRule ^international_careers$ /international_careers/international_careers.php [L,R]
RewriteRule ^major_careers$ /major_careers/academic_major_careers.php [L,R]
RewriteRule ^career$ /career/career.php [L,R]

這些指令的順序無關緊要。

如果您要重定向到同一域,則您不一定需要替換中的方案+主機名(即絕對 URL),但是,它可以幫助減少域規范化情況下的重定向次數。

我不明白為什么這種模式在重定向到外部時似乎有效 URL

因為指令在重定向后不會再次處理(您現在在不同的服務器上)。

 RewriteRule.*(?=major_careers) http://consul64.wwwaz1-ts107.a2hosted.com/major_careers/academic_major_careers.php [L,R]

使用未錨定的正面前瞻實際上與簡單的major_careers相同。

 RewriteRule ^/career http://consul64.wwwaz1-ts107.a2hosted.com/career/career.php [L,R] RewriteRule ^/major_careers http://consul64.wwwaz1-ts107.a2hosted.com/major_careers/academic_major_careers.php [L,R] RewriteRule ^/international_careers http://consul64.wwwaz1-ts107.a2hosted.com/international_careers/international_careers.php [L,R] RewriteRule ^/career_by_education http://consul64.wwwaz1-ts107.a2hosted.com/career_by_education/careers-by-educational-level.php [L,R]

這些都會導致“403 Forbidden”錯誤

由於斜杠前綴,這些規則永遠不會匹配,所以它們實際上不會做任何事情。


更新:

但是,這些重定向的“問題”是您重定向的 URL,例如。 /career_by_education也是您要重定向到的文件系統目錄的名稱。 因此,默認情況下,mod_dir 將嘗試 append 尾部斜杠,因此規則不匹配。 403 可能是由於該目錄中缺少 DirectoryIndex 文檔造成的。 嚴格來說,您的 URL 需要以尾部斜杠結尾,或者在正則表達式中將尾部斜杠設為可選(但這可能會導致雙重重定向)。

例如:

# Trailing slash is mandatory
RewriteRule ^career_by_education/$ /career_by_education/careers-by-educational-level.php [L,R]

# Trailing slash is optional
RewriteRule ^career_by_education/?$ /career_by_education/careers-by-educational-level.php [L,R]

盡管最好 URL 首先不匹配目錄名稱。

暫無
暫無

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

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