.htaccess-将/path.php重写为/ path /,而不是对子目录中的文件进行404处理

时间:2019-07-18 11:20:53

标签: php regex apache .htaccess

首先,我道歉。这个主题已经反复地被重新定义,(我知道。我读过它们。)但是由于某种原因,我的情况很奇怪,或者我在.htaccess中有其他问题。

客观

  1. 隐藏PHP文件扩展名,
  2. 301任何试图让他们走上伪装道路的尝试,
  3. 允许实际引用子目录中的PHP文件,
  4. 将文件名中的下划线重写为斜杠(/),以使它们看起来像是嵌套的。 (编辑:或将URL中的/转换为文件中的_-除非目录存在。)

... 3和4是踢腿者。

以下代码是我在此之前一直使用的.htaccess ...

<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /

## Imagine Some Code here ##

# Redirect to domain with www.
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Same for HTTPS:
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Ensure all directory URLs have a trailing slash.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\/$
RewriteCond %{REQUEST_URI} !\/[^\/]*\.[^\/]+$
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI}/ [L,R=301]
# Same for HTTPS:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\/$
RewriteCond %{REQUEST_URI} !\/[^\/]*\.[^\/]+$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI}/ [L,R=301]
</IfModule>

我尝试在我注意到的地方添加以下片段。

RewriteRule    ^$    /index.php    [L]
RewriteRule    ^([a-zA-Z0-9\-\_/]*)/$    /$1/index.php    [L]
RewriteRule    ^([a-zA-Z0-9\-\_/]*)\.(html|htm)$    /$1.php    [L]
RewriteRule    ^([a-zA-Z0-9\-\_/]*)$    /$1.php    [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

最成功的是:

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

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

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

最后一个实际上非常好,但是,我根本无法在子目录中以任何格式(带/不带扩展名)访问php文件。而且所有添加满足要求4的东西的尝试都行不通。

就我所希望的那样,有人去做BAM,就完成了。使用和享受。我也很想知道出什么问题了。

谢谢。

-编辑-

按照misorude的要求,以下URL是示例。

URL : actual_domain.com.au/blog-读取文件: /blog.asp

URL: Actual_domain.com.au/path/to-file-读取文件: /path_to-file.asp

URL::actual_domain.com.au/dir/file-读取文件: /dir/file.asp

在最后一个示例(/ dir /)中,存在dir目录。使用/ path /,它不是目录。

现在,关于目标3的措辞,我发现我尝试的.htaccess代码似乎在物理上阻止了子目录中的任何内容返回404。(例如,上面的最后一个示例引用/ dir /)

最后,关于/或_的重写,该文件包含_,我希望它在URL中以/的形式出现。

1 个答案:

答案 0 :(得分:0)

您可能具有以下.htaccess权限:

# turn directory slash on
DirectorySlash On
RewriteEngine On

# add www to a domain name taking care of both http and https
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]

# remove .php from URLs
RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=301,NE,L]

# ignore all files and directories
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

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

# Replace / by _ recursively
RewriteRule ^([^/]+)/(.+)$ $1_$2

请确保在测试时只有这些规则,并在新的浏览器上进行测试以避免旧的缓存。