2017-07-17 114 views
1

我有我的网站上,这是应该重定向到https以下htaccess的://和重写URL是这样的:.htaccess文件返回404子

http://company.com/product.php 

变为这样:

https://company.com/product/ 

下面是当前的代码:

ErrorDocument 404 /404.php 
RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+)/$ $1.php 
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$ 
RewriteRule (.*)$ /$1/ [R=301,L] 
RewriteRule ^updates/.*\.(zip)$ - [F,L,NC] 

的问题是,当我试图访问一个子文件夹,例如:

https://company.com/subfolder/ 

它返回404,我猜是因为它正在寻找一个subfolder.php文件?

,当我进入像这样我可以打开子文件夹的index.php文件:

https://company.com/subfolder/index.php 

我可以改变这个代码保存当前的功能,还允许访问子文件夹?

回答

1

你需要为这些规则的“不是一个目录”条件:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+)/$ $1.php 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php 

RewriteCond仅适用于下一RewriteRule所以你要重复它。

+0

谢谢,成功了! –

+0

没问题。乐意效劳! – colburton

+0

它会对'/ invalid-file.php'做一个额外的无用重写,而不是直接渲染'/ 404.php'。 – anubhava

0

只有在检查是否存在对应的.php文件而不是为每个缺失的文件添加.php之后,规则才应该添加.php

有这样的:

ErrorDocument 404 /404.php 
RewriteEngine On 

RewriteRule ^updates/.*\.zip$ - [F,L,NC] 

RewriteCond %{HTTPS} off 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [R=301,NE,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$ 
RewriteRule (.*)$ /$1/ [R=301,NE,L] 

RewriteCond %{DOCUMENT_ROOT}/$1.php -f 
RewriteRule ^(.+?)/?$ $1.php [L] 

RewriteCond %{DOCUMENT_ROOT}/$1/$2.php -f 
RewriteRule ^([^/]+)/(.+?)/?$ /$1/$2.php [L]