重写网址.htaccess

时间:2014-06-04 10:16:23

标签: regex apache .htaccess mod-rewrite url-rewriting

我相信它可能是重复的。但是我尽力去寻找适合我需要的东西,我找到了,没有。 所以这里基本上是我到目前为止,我将解释我需要修改的内容。

# 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吗?我真的厌倦了搜索,我根本不知道正则表达式。

2 个答案:

答案 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]

仅供参考,所有这些示例规则都在生产服务器上进行了深度测试。

现在有了这个,你就拥有了做一些好事所需的一切。工作