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样式不适用。

我试图玩在正则expression式的规则,如…

 RewriteRule ^([^/]+)[/]*$ mysitecom/movies/index.php?id=$1 [L,QSA] 

…但它没有帮助。

所以我的问题是如何处理斜线在我的情况? 我应该select我的重写规则还是需要做别的事情? 我需要确保http://mysite.com/movies/123/的处理方式与http://mysite.com/movies/123完全相同。 有什么想法吗?

谢谢,

更新:

用户DSumsky帮助了我(下图)。

Dsumsky ,非常感谢你的回答。 我决定以答案的forms发表评论,以获得格式化文本的能力。

首先,我没有启用日志logging。 有了这个string在我的.htaccess中

 RewriteLog "/var/log/apache2/rewrite.log" RewriteLogLevel 3 

…我有以下错误:

 Rewrite log not allowed here 

那么,我把这些string放入/etc/apache2/apache2.conf并重新启动apache。 rewrite.log已创build,但即使发生重写也是空的。

其次,没有下面的string,它根本不工作:

 RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f 

所以我加了他们。 然后,%{HTTP_HOST}出了问题,所以通过指定一个path来改变它:

 RewriteRule ^([^/]*)/?$ mysitecom/movies/index.php?id=$1 [L] 

事情变好了 与http://mysite.com/movies/123和http://mysite.com/movies/123/我看到id应用。 在前一种情况下,一切都是完好的,但在后来的情况下,CSS样式不被应用,就好像它们没有被指定一样。 我不明白为什么会发生。 对我来说,在重写规则正在执行之前,它看起来像是应用了样式。 我认为是因为我用以下方式链接样式:

所以,它看起来像/ 123它的工作,我的意思是Apache能够find../library/main.css,但/ 123 /它似乎是一个embedded式目录和../library/main.css doesn'工作。

有任何想法吗?

UPDATE2:

我知道了。 最后的.htaccess:

 RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RedirectMatch ^(.+[\d+])/$ $1 RewriteRule ^([^/]*)$ mysitecom/movies/index.php?id=$1 [L] 

DSumsky ,感谢您的帮助! 我把你的post标记为答案。

我创build了一个testingVirtualHost来满足您的要求,并configuration了下面的重写规则,这似乎是做你想要的:

 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,并剥离如果在那里的尾部斜杠。

当你不确定关于重写引擎启用日志logging的情况,就像我configuration的一样。 你可以检查每一个单引擎执行的引擎,然后正确地testing你的规则。

我使用以下URL进行testing:

 http://mysite.com/movies/123 http://mysite.com/movies/123/ 

我在日志中find相应的行:

 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'