[英]URL rewriting doesn't work right after adding a query string line into it
此URL重寫行可以正常工作, 直到查詢字符串行為止 ,並且在查詢字符串之后,它們中的任何一個都不起作用。
ReWriteEngine On
ReWriteRule ^home?$ /mysite/index.php
ReWriteRule ^gallery?$ /mysite/gallery.php
ReWriteRule ^([a-z0-9]+)?$ /mysite/owner.php?name=$1
ReWriteRule ^about?$ /mysite/about.php
ReWriteRule ^location?$ /mysite/location.php
前兩行home和gallery按預期工作(包括第三行查詢字符串 ),但其余兩行關於和位置不起作用。 如果我要求使用重寫的名稱來顯示這兩頁,則 這些頁面不會出現在瀏覽器中 (響應什么都沒有,除了我得到的頁面與我當前所在的頁面相同-甚至沒有收到404錯誤消息),但是如果我要求這些頁面原始名稱帶有.php擴展名的頁面該頁面進入瀏覽器。 我嘗試將這兩個about和location 放在查詢字符串行的頂部,然后這兩個頁面按預期工作正常 ,但是當它們在查詢字符串行的下面時,只有它們不起作用。 我能知道URL重寫方法有什么問題嗎? 我仍然無法解決問題。
您的嘗試有很多問題,這是一個稍作修改的版本:
ReWriteEngine On
ReWriteRule ^/?home/?$ /mysite/index.php [END]
ReWriteRule ^/?gallery/?$ /mysite/gallery.php [END]
ReWriteRule ^/?about/?$ /mysite/about.php [END]
ReWriteRule ^/?location/?$ /mysite/location.php [END]
ReWriteRule ^([a-z0-9]+)/?$ /mysite/owner.php?name=$1 [END]
規則的順序很重要。 更一般的應該放在更專業的下面 。
如果您遇到http狀態500(服務器內部錯誤)的情況,並且上述設置機會是您使用的Apache http服務器的版本非常舊。 在那種情況下,用[L]
標志替換[END]
標志,在這種情況下也應該可以正常工作。
以上規則在實際的http服務器主機配置和動態配置文件中同樣起作用。
還有一個一般性提示:您應該始終喜歡將此類規則放置在http服務器(虛擬)主機配置中,而不是使用動態配置文件( .htaccess
樣式文件)。 眾所周知,這些文件容易出錯,難以調試,並且確實降低了服務器的速度。 僅當您無法控制主機配置(閱讀:真正便宜的托管服務提供商)或者您的應用程序依賴於編寫自己的重寫規則(這顯然是安全噩夢)時,才將它們作為最后一個選項來支持。 )。
我會改變這些順序
ReWriteRule ^([a-z0-9]+)?$ /mysite/owner.php?name=$1
ReWriteRule ^about?$ /mysite/about.php
ReWriteRule ^location?$ /mysite/location.php
至
ReWriteRule ^about$ /mysite/about.php [L]
ReWriteRule ^location$ /mysite/location.php [L]
ReWriteRule ^([a-z0-9]+)$ /mysite/owner.php?name=$1 [L]
並添加最后一個標志。
^([a-z0-9]+)?
更通用,可以在到達最后2條規則之前匹配並更改URL。
換句話說,如果您的URL與其相關about
則匹配此^([a-z0-9]+)?
被更改,然后與實際規則不匹配。 因此,通過將更通用的規則放在最后,您可以避免這種情況。
就像我在評論中所說的,我會在[L]
Last
[L]
或[ Last
[L]
添加[L]
標志,這樣一旦完成匹配,它將結束重寫,否則您將獲得意外的匹配。
您也可以結合其中一些(可能)
ReWriteRule ^(about|location)$ /mysite/$1.php [L]
我很確定?
表示前面的匹配是可選的,但是我刪除了它,因為如果沒有,則捕獲組是可選的。 所以我不確定您在那里擁有它的目的是什么。 因為在我閱讀時,這意味着^about?$
,而t
是可選的...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.