Apache mod_rewrite:如何處理 URL 中的斜線?

Apache mod_rewrite:如何處理 URL 中的斜線?

我有以下 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/123http://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'

相關內容