我有以下 URL 架構:
http://mysite.com/movies/index.php?id=123
我想擺脫 index.php?id=123 並使用以下 URL:
http://mysite.com/movies/123
我在 /var/www/mysitecom/movies 目錄中提出了以下 .htaccess :
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ mysitecom/movies/index.php?id=$1 [L,QSA]
它有效。例如,當我指定...
http://mysite.com/movies/123
....我明白了...
http://mysite.com/movies/index.php?id=123
當我指定時,麻煩就開始了...
http://mysite.com/movies/123/
有了這個斜杠,我就沒有正確處理 URL。看來我根本沒有指定id,而且我所有的css樣式都沒有應用。
我嘗試在規則中使用正規表示式,例如...
RewriteRule ^([^/]+)[/]*$ mysitecom/movies/index.php?id=$1 [L,QSA]
……但這沒有幫助。
所以我的問題是如何處理我的情況下的斜線?我應該選擇重寫規則還是需要做其他事情?我需要確保http://mysite.com/movies/123/處理方式與http://mysite.com/movies/123。有什麼想法嗎?
謝謝,
更新:
使用者杜薩姆斯基幫助了我(如下)。
德蘇姆斯基, 非常感謝您的回答。我決定以答案的形式進行評論,以獲得格式化文字的能力。
首先,我未能啟用日誌記錄。在我的 .htaccess 中使用這個字串...
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3
....我有以下錯誤:
Rewrite log not allowed here
好吧,我將這些字串放入 /etc/apache2/apache2.conf 並重新啟動 apache。 rewrite.log 已創建,但即使發生重寫,它也會變空。
其次,如果沒有以下字串,它根本不起作用:
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
所以我添加了它們。然後,%{HTTP_HOST} 出了問題,所以我透過指定路徑對其進行了一些更改:
RewriteRule ^([^/]*)/?$ mysitecom/movies/index.php?id=$1 [L]
事情變得更好了。既http://mysite.com/movies/123和http://mysite.com/movies/123/我看到 id 已應用。在前一種情況下,一切都很好,但在後一種情況下,CSS 樣式不會被應用,就好像它們根本沒有被指定一樣。我不明白為什麼會這樣。對我來說,看起來樣式是在執行重寫規則之前應用的。我這麼認為是因為我透過以下方式連結樣式:
所以,它看起來對於/123 是有效的,我的意思是Apache 能夠找到../library/main.css,但是對於/123/ 它似乎是一個嵌入式目錄,而../library/main.css則不然。
有任何想法嗎?
更新2:
我得到了它。最終的.htaccess:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RedirectMatch ^(.+[\d+])/$ $1
RewriteRule ^([^/]*)$ mysitecom/movies/index.php?id=$1 [L]
杜薩姆斯基, 感謝您的幫忙!我將您的帖子標記為答案。
答案1
我建立了一個測試虛擬主機來滿足您的要求,並配置了以下重寫規則,這似乎符合您的預期:
RewriteEngine On
RewriteLog "/var/log/httpd/rewrite.log"
RewriteLogLevel 3
RewriteCond %{HTTP_HOST} mysite\.com [NC]
RewriteRule ^/movies/([^/]*)/?$ %{HTTP_HOST}/movies/index.php?id=$1 [L]
該規則匹配 URI 的最後部分(一種電影 ID),並刪除結尾斜杠(如果存在)。
當您不確定按照我配置的重寫引擎啟用日誌記錄發生了什麼情況時。您可以檢查引擎執行的每個步驟並正確測試您的規則。
我使用以下 URL 對其進行了測試:
http://mysite.com/movies/123
http://mysite.com/movies/123/
我在日誌中找到了相應的行:
init rewrite engine with requested uri /movies/123
applying pattern '^/movies/([^/]*)/?$' to uri '/movies/123'
rewrite '/movies/123' -> 'mysite.com/movies/index.php?id=123'
init rewrite engine with requested uri /movies/123/
applying pattern '^/movies/([^/]*)/?$' to uri '/movies/123/'
rewrite '/movies/123/' -> 'mysite.com/movies/index.php?id=123'