我試圖將 url 從長改寫為短,但無法解決這個問題。
我的調查重寫效果很好,但在完成我的 survet php 重定向到www.example.com/survey_thank_you.php?survey_id=1 但我想顯示像www.example.com/thank_you這樣的網址
我什至不確定這是否可能。
我是 .htaccess 的新手,我幾乎什么都試過了
.htaccess
Options FollowSymLinks
Options -MultiViews
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^survey_thank_you.php?survey_name=([0-9a-zA-Z] )/?$ Thank_you [L,NC,QSA]
RewriteRule ^([0-9a-zA-Z] )/?$ survey_form.php?survey_name=$1 [L,NC,QSA] #works like charm.
任何幫助或指示將不勝感激。
解決方案:
Options FollowSymLinks
Options -MultiViews
RewriteEngine on
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^survey_id=([0-9a-zA-Z] )/?$
RewriteRule ^survey_thank_you\.php$ /%1/thank_you [R,L,QSD]
RewriteRule ^([0-9a-zA-Z] )/thank_you$ survey_thank_you.php?survey_id=$1 [L,NC,QSA]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([0-9a-zA-Z] )/?$ survey_form.php?survey_name=$1 [L,NC,QSA]
uj5u.com熱心網友回復:
但在完成我的 survet php 重定向到
www.example.com/survey_thank_you.php?survey_id=1
您需要在調查后“更正”PHP 將您重定向到的 URL。如果所需的 URL 是/thank_you(或/Thank_you?),那么 PHP 應該重定向到該 URL。
然后,您使用 mod_rewrite in.htaccess在內部重寫/thank_you回您的應用程式可以理解的 URL。IE。/survey_thank_you.php?survey_id=1. 然而,這里還有另一個問題,查詢字串中的1( survey_id) 是從哪里來的?大概你不想硬編碼這個?所以這需要傳入請求的 URL。例如。/1/thank_you或者也許/thank_you/1?
然而,這真的有必要嗎?生成的“謝謝”頁面不是應該被索引的頁面,也不是用戶通常導航到的頁面,所以在這里實作一個用戶友好的 URL 似乎不是一個值得練習的事情?
RewriteRule ^survey_thank_you.php?survey_name=([0-9a-zA-Z] )/?$ Thank_you [L,NC,QSA] RewriteRule ^([0-9a-zA-Z] )/?$ survey_form.php?survey_name=$1 [L,NC,QSA] #works like charm.
您在指令中使用了survey_nameURL 引數(參考字母數字值),但survey_id在前面的示例中使用了(“數字”?) URL 引數?那么,它是什么?還是這些規則無關?
您說第二條規則“像魅力一樣起作用”,但是如何?你要什么網址?那似乎會改寫/Thank_you為survey_form.php?survey_name=Thank_you-但這看起來不正確?
如評論中所述,該RewriteRule 模式僅與 URL 路徑匹配。要匹配查詢字串,您需要一個與服務器變數匹配的附加條件。QUERY_STRING這也需要是外部 3xx 重定向,而不是內部重寫(以更改用戶看到的 URL)。其中存在另一個問題……如果您不更改 PHP 腳本重定向到的 URL,那么用戶在提交表單后將經歷兩次重定向。
您還需要小心避免重定向回圈,因為您在內部以相反的方向重寫請求。您需要防止在請求被重寫后觸發重定向。IE。只有重定向來自用戶的直接請求才應該被重定向。
因此,要回答您的具體問題,應該改寫如下:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^survey_name=[0-9a-zA-Z] /?$
RewriteRule ^survey_thank_you\.php$ /Thank_you [QSD,R,L]
對REDIRECT_STATUS環境變數的檢查確保只處理直接請求,而不是稍后重寫的內部重寫請求。在初始請求時REDIRECT_STATUS為空200,并在第一次成功重寫后設定為字串(如 200 OK 狀態)。
該QSD標志 (Apache 2.4) 是從重定向回應中丟棄原始查詢字串所必需的。
所以上面會重定向 /survey_thank_you.php?survey_name=<something>到/Thank_you.
但這正在丟失“survey_name”(或survey_id?),因此可能應該更像以下內容,以保留“survey_name”:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^survey_name=([0-9a-zA-Z] )/?$
RewriteRule ^survey_thank_you\.php$ /%1/Thank_you [QSD,R,L]
Where %1 is a backreference to the value of the survey_name URL parameter captured in the preceding CondPattern.
However, you would then need to modify your rewrite that turns this back into an understandable URL.
(But you should probably not be doing this in the first place without first changing the actual URLs in the application.)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/449235.html
