0

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

4

1 回答 1

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 页面。为此,您需要在“# vanity 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/作为匹配和重定向的一部分。

于 2013-10-02T22:01:21.800 回答