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


Vanity URLs and file extension scripts interfering together

我的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>

关于虚 URL,它工作正常,但是当涉及到删除 URL 末尾的 php 扩展时,它不起作用

1.如果我输入mysite.com/home.php,我确实会被重定向到home.php但扩展名仍然存在于地址栏中。

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

如何修复 1. 和 2. ?

您需要在用户名路由之前进行 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/作为匹配和重定向的一部分。