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

我创建了一个测试 VirtualHost 来满足您的要求,并配置了以下重写规则,该规则似乎可以实现您的预​​期:

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'

相关内容