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