我相信它可能是重复的。但是我尽力去寻找适合我需要的东西,我找到了,没有。 所以这里基本上是我到目前为止,我将解释我需要修改的内容。
# Forbidden Access
ErrorDocument 403 /403.php
# Not Found
ErrorDocument 404 /404.php
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
RewriteBase /
</IfModule>
<IfModule mod_rewrite.c>
# Strip off .php extension if it exists
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L,NC]
# Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ /403.php$1 [R=301,L]
# Resolve .php file for extensionless php urls
RewriteRule ^([^/.]+)$ $1.php [L]
</IfModule>
现在这似乎完美无瑕。但它有一个错误。我先解释一下。
1)如果存在,它会自动剥离.php扩展名。如果它是外部请求的URL,则不确定它是否会剥离.php。忘记检查,但也许你已经知道了,所以你可以告诉我吗?
2)当我输入这个...“http://website.dev/img/”它确实给了我一个“403 Forbidden Access”。这一切都很好。
3)当我尝试这个时......“http://website.dev/index”它会加载页面,即使手动添加.php扩展名也会将其剥离。所以这里也很好...
4)当我尝试这样的随机路径时......“http://website.dev/asdasd”它确实给了我一个“404 Not Found”。所以我们在这里也很好。
但主要问题在于......
5)当我尝试跟踪...“http://website.dev/dashboard/index”它给我一个404 Not Found,即使它应该加载没有问题。它出现在仪表板目录中的所有页面。
你能帮我修改上面的htaccess吗?我真的厌倦了搜索,我根本不知道正则表达式。
答案 0 :(得分:1)
这是因为您最后一条规则中使用的错误正则表达式以静默方式添加.php
扩展名。将最后一条规则更改为:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI}\.php -f [NC]
RewriteRule ^(.+?)/?$ /$1.php [L]
答案 1 :(得分:1)
这是我对你的规则的翻译:
# Strip off .php extension if it exists
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
评论不好。 regexp意味着:剥离所有先包含3个大写且其中包含dot php
的文件。也许你已经忘记了结尾 $
?
# Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ /403.php$1 [R=301,L]
为什么?只需进行重定向,Apache就会为您处理301
:
RewriteRule .* - [L,R=403]
然后是最后一个问题:如果您稍后重新添加,为什么要剥离.php
扩展名?的 (°_o)
强>
所以这是你应该做的事情,举一些例子,并根据你的需要调整它们:
首先测试文件是否没有特殊处理。如果是这样,请立即停止,如下所示:
RewriteRule ^/(robots\.txt|404\.php|403\.php)$ -
然后测试是否有人试图入侵。如果是这样,请重定向到您想要的任何内容:
RewriteRule (.*)test.php - [QSA,L]
RewriteRule (.*)setup.php http://noobs.land.com/ [NC,R,L]
RewriteRule (.*)admin(.*) http://noobs.land.com/ [NC,R,L]
RewriteRule (.*)trackback(.*) http://noobs.land.com/ [NC,R,L]
然后,仅在此之后,禁止php
扩展名:
RewriteRule (.*)php$ - [L,R=404]
然后,接受所有静态“已知”文件扩展名,如果匹配则停止:
RewriteRule (.*)(\.(css|js|htc|pdf|jpg|jpeg|gif|png|ico|mpg|mp3|ogg|wav|otf|eot|svg|ttf|woff)){1}$ $1$2 [QSA,L]
现在你可以做一些测试了。如果URI以“aabb/
”结尾,请测试您是否有名为aabb.php
的文件,如果有,请执行以下操作:
RewriteCond %{REQUEST_URI} (\/([^\/]+))\/$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule (.*) %{DOCUMENT_ROOT}/%1.php [QSA,L]
如果没有处理,你到了这里,这是一个问题,所以停止它:
RewriteRule .* - [L,R=404]
仅供参考,所有这些示例规则都在生产服务器上进行了深度测试。
现在有了这个,你就拥有了做一些好事所需的一切。工作