2011-09-11 143 views
0

我有这样的代码,所有.PHP重定向到没有扩展名:隐藏扩展名和扩展名为重定向URL

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)/$ $1.php 

所以/example.php = /例如

我想它,所以如果有人点击在/example.php上它们会自动以/ example结尾。

什么是最好的方式去呢?将这两个链接的工作视为重复的内容?

+0

这种重定向有什么意义? –

+0

[Redirect * .php to clean URL](http://stackoverflow.com/q/2267488/)的可能重复,[在url mod_rewrite中隐藏扩展名.php](http://stackoverflow.com/q/6241408/ ) – outis

回答

2

试试这个:

RewriteEngine On 

# if requested .php file directly, then redirect to extension-less URL 
# (do it on initial rewrite iteration only) 
RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteRule ^(.+)\.php$ /$1 [R=301,L] 

# Your "add .php file extension" rule goes below 

这种方法的问题是,%{ENV:REDIRECT_STATUS}变量可能不被填充/由Apache的安装/配置支持。不幸的是,我不知道需要做些什么才能使其工作。


如果上述方法无效,请尝试以下解决方法 - 它会工作但不是说“好”,并在某些情况下可能会失败(查询字符串值是这里的薄弱点):

RewriteEngine On 

# if requested .php file directly, then redirect to extension-less URL 
# (do it on initial rewrite iteration only) 
RewriteCond %{THE_REQUEST} ^[A-Z]+\s.+\.php\sHTTP/.+ 
RewriteRule ^(.+)\.php$ /$1 [R=301,L] 

# Your "add .php file extension" rule goes below 

在这条规则重写条件是很重要的 - 没有它,你就会有无穷的重定向循环,你的浏览器会在某个时刻中止(除非它是不够聪明(或请求是由一些编码不机器人完成)并且这样的过程必须被杀死全线)。

把这样的重定向规则放在“添加.php文件扩展名”规则的上面或下面并不重要 - 我只是希望保持所有301重定向接近顶端。

+0

@checkenginelight所以..这个规则是否适合你? – LazyOne

+0

是的第二个似乎工作非常感谢! – checkenginelight

0

您可以执行301“永久移动”重定向,通知客户端请求的资源已移动并在新位置可用。要做到这一点使用RewriteRule,添加[R=301,L]标志的规则规范,例如:

RewriteRule ^(.*)/$ $1.php [R=301,L] 

这被认为是“搜索引擎友好的”重定向方法。

+0

当我将它添加到我的代码中时,我可以访问我的/example.php页面,但不会访问/ example页面,因为它会像这样重定向到somethign:http://www.domain1.com/home/username/domains/domain1。 com/public_html/example.php我想要它,当我尝试点击/example.php它会自动带我到/例如 – checkenginelight

+0

然后,你需要写规则的另一种方式:'RewriteRule(。*)。php $/$ 1 [R = 301,L]' –