我的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.?
答案 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/
作为匹配和重定向的一部分。