我有以下 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
我创建了一个测试 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'