如何?虚荣URL&使用.htaccess忽略.PHP扩展名

时间:2011-12-21 00:47:04

标签: php .htaccess vanity-url

我有以下.htaccess完美运作:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]
RewriteRule ^(.*)$ http://www.mysite.com/mypage.php?u=$1 [NC]

这将允许我写这样的网址:

http://www.mysite.com/peter  =>  http://www.mysite.com/mypage.php?u=peter

但是如果我想要一个附加规则来避免为现有文件编写.php扩展名呢?

http://www.mysite.com/contact   (contact.php exists on file)

我尝试将此添加到我的curr htaccess(但不起作用):

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

换句话说,我想拥有虚荣网址并忽略同一.htaccess中的.php扩展名。


解决了! 感谢Ulrich Palha和Mario(不知道订购和最后[L]旗帜!

RewriteEngine on
# Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ http://www.mysite.com/$1 [R=301,L]

# Redirect external .php requests to extensionless url
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.+)\.php$ http://www.mysite.com/$1 [R=301,L]

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

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]
RewriteRule ^(.*)$ http://www.mysite.com/mypage.php?u=$1 [NC]

2 个答案:

答案 0 :(得分:1)

这是一个订购问题。 RewriteRules按照.htaccess中记录的顺序应用 见Everything You Ever Wanted to Know about Mod_Rewrite Rules but Were Afraid to Ask?

只需将新块添加为第一个重写语句,添加[LAST]标志,它就可以正常工作。

此规则无条件地工作(不受任何RewriteCond保护),因此应始终是所有RewriteRules中的最后一个:

 RewriteRule ^(.*)$ ...

(所有RewriteRules之前都应该带有[L]标志。你有一些解决方法。)

答案 1 :(得分:0)

对我来说,这段代码工作:

在“ / etc / apache2 / sites-available / default ”或“ httpd.conf

您必须在默认目录

中拥有(至少)这些选项
...
    <Directory />
        ...
        Options FollowSymLinks
        AllowOverride All
        ...
    </Directory>
...

在站点特定的站点目录中的OR

...
    <Directory "/var/www/my-site">
        ...
        Options FollowSymLinks
        AllowOverride All
        ...
    </Directory>
...

在网站目录中创建或编辑“ .htacces ”(例如“/var/www/my-site/.htaccess”)并添加以下代码:

AddType application/x-httpd-php htm html php
AddHandler application/x-httpd-php .htm .html

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]