虚荣URL和文件扩展脚本干扰在一起

时间:2013-10-02 04:14:25

标签: php .htaccess url file-extension vanity-url

我的htaccess文件中有以下代码:

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

#vanity URL
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9-_]*)$ /profile.php?username=$1 [L,QSA]
RewriteCond %{THE_REQUEST} \ /profile\.php\?username=([^&\ ]+)&?([^\ ]*)
RewriteRule ^ /%1?%2 [L,R=301]

#remove file extensions
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]


ErrorDocument 400 /404.php
ErrorDocument 401 /404.php
ErrorDocument 403 /404.php
ErrorDocument 404 /404.php 
ErrorDocument 500 /404.php

<Files .htaccess>
order allow,deny
deny from all
</Files>

关于虚荣网址,它运行正常,但是当删除网址末尾的 php扩展程序时,它不起作用

1。如果我输入mysite.com/home.php,我会被重定向到home.php但扩展程序仍在地址栏中。

2。如果我输入mysite.com/home,我会被重定向到我的自定义错误页面,因为home不是用户名是我的数据库。

如何修复1.和2.?

1 个答案:

答案 0 :(得分:1)

您需要执行php扩展程序检查之前用户名路由。当然,如果您碰巧有一个与用户名相同的php文件,这将会中断,除非您在所有用户名前添加前缀,否则无法解决此问题。

因此,交换规则并添加另一条规则来重定向直接访问php文件:

# we don't want to mess with /profile.php access because there's a rule later that deals with that
RewriteCond %{REQUEST_URI} !^/profile\.php
RewriteCond %{THE_REQUEST} \ /(.*)\.php(\?|\ |$)
RewriteRule ^ /%1 [L,R=301]

# add file extensions back to URI
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

#vanity URL
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9-_]*)$ /profile.php?username=$1 [L,QSA]
RewriteCond %{THE_REQUEST} \ /profile\.php\?username=([^&\ ]+)&?([^\ ]*)
RewriteRule ^ /%1?%2 [L,R=301]

用户的前缀是什么意思:

http://mysite.com/u/foobar

这里,/u/表示“foobar”是用户,而不是php页面。为此,您需要在“#虚荣URL”部分添加一些更改:

#vanity URL
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^u/([a-zA-Z0-9-_]*)$ /profile.php?username=$1 [L,QSA]
RewriteCond %{THE_REQUEST} \ /profile\.php\?username=([^&\ ]+)&?([^\ ]*)
RewriteRule ^ /u/%1?%2 [L,R=301]

基本上包括/u/作为匹配和重定向的一部分。