0

我为我的学校建立了一个小型家长/教师社交网络。我使用我的.htaccess文件使指向教师资料的链接更清晰,并在所有 url 中添加尾部斜杠。转到/teachers/teacher-name/链接(有时)重定向到/teachers/teacher-name.php.php.php.php.php.php.php.php...以下是我的.htaccess文件时,我遇到了这个问题。有时,如果我在 Chrome 中清除浏览器缓存,它会暂时修复它。我不能完全正确的.htaccess语法,但我很熟悉它。任何建议表示赞赏!

RewriteEngine on
RewriteBase /

#remove php ext
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ $1/$2.php

#force trailing slash/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)([^/])$    /$1$2/ [L,R=301]

#other rewrites
RewriteRule ^teachers/([^/\.]+)/$ /teachers/profile.php?u=$1
RewriteRule ^teachers/([^/\.]+)/posts/$ /teachers/posts.php?u=$1
RewriteRule ^teachers/([^/\.]+)/posts/([^/\.]+)/$ /teachers/post.php?u=$1&p=$2

RewriteRule ^gallery/([^/\.]+)/$ /gallery/album.php?n=$1
RewriteRule ^gallery/([^/\.]+)/slideshow/$ /gallery/slideshow.php?n=$1
RewriteRule ^gallery/([^/\.]+)/([^/\.]+)/([^/\.]+)/$ /gallery/photo.php?a=$1&p=$2&e=$3

编辑:我附上了我在说什么的截图。 在此处输入图像描述

4

3 回答 3

1

这应该是因为您决定添加斜杠:

#force trailing slash/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)([^/])$    /$1$2/ [L,R=301]

而不是这个,你可能想写这个:

#force trailing slash/
RewriteCond %{REQUEST_FILENAME} !-f
#the following rule only works for .php obviously, so add other rules
RewriteCond %{REQUEST_URI} !\.php$
RewriteRule ^(.*)([^/])$    /$1$2/ [L,R=301]

并且因为你使用了 301 重定向,浏览器最有可能缓存重定向,所以你可能需要在它工作之前清除浏览器缓存。

于 2012-06-27T03:33:39.437 回答
0

在 .php 规则的末尾添加一个[L]以确保 mod_rewrite 停止处理。

通常,当您找到与规则匹配的类型时,它是您唯一希望根据您的请求运行的匹配项。您的最后六个规则也是这方面的示例,除了您可以在它们上不使用它,因为它们不会相互重叠。

于 2012-06-27T02:31:20.243 回答
0

再看一遍,我看到了一个不同的错误。您显然有两条规则试图共享条件。这不起作用。每个规则必须有自己的条件

#remove php ext
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ $1/$2.php #this rule will always run

应该改为

#remove php ext
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/]+)/$ $1.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/]+)/([^/]+)/$ $1/$2.php #this rule will always run

但是,除此之外,您是否要添加.php到以 ? 结尾的 URL 中/

RewriteRule ^([^/]+)/$ $1.php
于 2012-06-27T19:18:50.327 回答