2013-09-30 86 views
1

我在我的.htaccess文件中有一个代码..它将每个.php重定向到非php。我希望它只能指导一个PHP文件,不要重定向其余.. forexample我想abc.php是abc但bcd.php保持为bcd.php ..我怎样才能修改这个脚本来得到这个结果?谢谢。Apache mod_rewrite没有重定向到PHP,但重定向到其他URL

RewriteEngine on 
#Redirect non-php to php and stop futher processing 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php [L] 

#redirect .php to non-php 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^(.*)\.php$ $1 [R=301,L] 
+0

“它将每个.php重定向到非php” - 这是一个谎言。它将非php重定向到php – user4035

回答

2

此代码应为你工作:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+(abc)\.php[?\s] [NC] 
RewriteRule^%1 [R=301,L] 

#Redirect non-php to php and stop futher processing 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php [L] 

重要的是在这里使用%{THE_REQUEST}代表原HTTP请求由Apache收到,以避免循环。 %{THE_REQUEST}不会使用各种重写规则进行重写,这与使用用于RewriteRule的URI模式的情况相反。

+0

非常感谢你..你的代码工作太..但我很困惑..我怎么能理解,如果它的循环或不?有没有办法检查它? –

+1

不幸的是,所有在线的.htaccess重写都不可靠。我自己测试了其他代码,并导致了循环。 – anubhava

0

将有例外和L标志的规则一般重写规则之前:

RewriteEngine on 
#redirect abc.php to abc 
RewriteRule ^abc\.php$ abc [R=301,L] 

#Redirect non-php to php and stop futher processing 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteCond %{REQUEST_URI} ! abc$ 
RewriteRule ^(.*)$ $1.php [L] 
+0

这保证会导致循环。 – anubhava

+0

谢谢..它看起来像工作..你如何理解它是否会导致循环? –

+0

@EnginErdoğan它不会导致循环,导致abc不是一个PHP文件。所以第二个RewriteCond会保护你免于循环 – user4035