用mod_rewrite双击

时间:2014-01-30 16:07:46

标签: apache .htaccess mod-rewrite

我无法让我的.htaccess文件正确并做我想要的事情。 在php中,我写了一个路由器来检查请求的uri。 我想要的重写规则是:

  • 应将example.com/images/*的请求重写为 example.com/view/template/images/*,但未重定向。
  • example.com的请求应重定向到example.com/1/
  • 不直接定位文件的请求应该有一个尾部斜杠(带有 重定向)。
  • 不直接定位文件的请求应重写为index.php(无形,无重定向)。

我当前的.htaccess文件符合所有这些要求,但存在严重缺陷。 当我转到example.com时,它会被正确地重定向到example.com/1/并重写为index.php,但是当我查看Apache访问日志时,请求会被执行两次。

127.0.0.1 - - [30/Jan/2014:16:53:39 +0100] "GET / HTTP/1.1" 302 310 "-" "user-agent..."
127.0.0.1 - - [30/Jan/2014:16:53:40 +0100] "GET / HTTP/1.1" 302 310 "-" "user-agent..."
127.0.0.1 - - [30/Jan/2014:16:53:39 +0100] "GET /1/ HTTP/1.1" 200 11 "-" "user-agent..."
127.0.0.1 - - [30/Jan/2014:16:53:40 +0100] "GET /1/ HTTP/1.1" 200 11 "-" "user-agent..."

index.php我有一个记录器,这个也记录了两次点击。

这是我目前的.htaccess

RewriteEngine On
RewriteBase /

RewriteRule ^favicon.ico$               view/template/images/favicon.ico
RewriteRule ^images/(.*)$               view/template/images/$1
RewriteRule ^js/(.*)$                   view/template/javascript/$1
RewriteRule ^css/(.*)$                  view/template/css/$1

RewriteRule ^$                          1/ [R,L]
RewriteRule ^/$                         1/ [R,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$                      $1/ [R,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$                        index.php [L]

任何想法有什么不对?如果我的.htaccess文件被完全延迟,请不要开枪: - )

1 个答案:

答案 0 :(得分:1)

试试这段代码:

RewriteEngine On
RewriteBase /

RewriteRule ^favicon\.ico$              view/template/images/favicon.ico [L,NC]
RewriteRule ^(images|js|css)/(.*)$      view/template/$1/$2 [L,NC]

RewriteRule ^$ 1/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.+)$  $1/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]