htaccess配置删除目录结构

时间:2015-06-16 17:11:19

标签: php apache .htaccess

我是服务器配置的新手,并且在使用htaccess配置时遇到了一些困难。我正在使用这个htaccess在没有.php扩展的情况下工作,同时如果用户最后输入.php它也会删除该部分并显示更清晰的URL。在结束部分,我正在使用error.php处理错误

RewriteEngine On

# Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ http://example.com/$1 [R=301,L]

# Redirect external .php requests to extensionless url
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.+)\.php$ http://example.com/$1 [R=301,L]

# Resolve .php file for extensionless php urls
RewriteRule ^([^/.]+)$ $1.php [L]

ErrorDocument 400 /error.php
ErrorDocument 401 /error.php
ErrorDocument 403 /error.php
ErrorDocument 404 /error.php
ErrorDocument 500 /error.php

在root用户的页面上,每件事情都很有效,例如

  

example.com/contact

但是文件夹中的内容变得复杂,例如

  

example.com/photo/views

此处不是显示“/photo/views.php”,而是找不到404页面并看到我的错误页面。

但我可以在照片目录下看到索引页面为。

  

example.com/photo /

但仍然会在

上获得错误页面
  

example.com/photo/index

如果我删除了.htaccess文件,那么一切都可以正常使用.php扩展名。

如果有人能告诉我我做错了什么,我会很高兴。

2 个答案:

答案 0 :(得分:2)

您的规则声明请求URI中不允许使用正斜杠。因此,重写将无效。

将您的规则更改为:

RewriteRule ^([^.]+)$ $1.php [L]

我已从表达式中删除了正斜杠,因此它现在只允许句点(.)。

答案 1 :(得分:1)

您需要从第二条规则中的排除字符类中删除/并稍微调整一下您的正则表达式:

ErrorDocument 400 /error.php
ErrorDocument 401 /error.php
ErrorDocument 403 /error.php
ErrorDocument 404 /error.php
ErrorDocument 500 /error.php
RewriteEngine On

# Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ /$1 [R=301,L]

# Redirect external .php requests to extension-less url
RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=302,L,NE]

# Resolve .php file for extension-less php urls
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f [NC]
RewriteRule ^(.+?)/?$ $1.php [L]