2015-06-16 46 views
1

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

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 

每一件事情适用于在根页面大,如

example.com/contact

但事情在文件夹内部变得复杂,如

example.com/photo/views

在这里,而不是显示“/photo/views.php”,我得到404页面未找到并看到我的错误页面。

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

example.com/photo/

但还是得到

example.com/photo/index

错误页面,如果我删除.htaccess文件的一切最后以.php扩展名正常工作。

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

回答

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] 
2

您的规则指出请求URI中不允许使用正斜杠。因此,重写将不起作用。从表达

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

我已删除斜杠,以便它现在只禁止周期(.):

您的规则更改为。