9

编辑:当前 .htaccess 文件:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

## hide .php extension snippet

# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L]

# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

我的网站托管在连接到大型托管帐户的域的子文件夹中。

basesite
  /iioengine
    /forums
      /.htaccess //file works
      /.... //other MyBB content
    /demos.php
    /index.php //iioengine.com (homepage)
    /.htaccess //file doesn't work
    /... //other iioengine php pages

是我使用两个不同的 htaccess 文件的问题吗?

这是一个需要工作的链接:http: //iioengine.com/demos

我注意到这个当前的 htaccess 文件也破坏了所有论坛的 URL

这不再有效:http: //iioengine.com/forums/Forum-Box2D

编辑:感谢您重新打开,我已经取得了一些进展。这是我当前的 htaccess 文件:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
</IfModule>

我仍然得到 404 页,但如果我把这一行放在:

RewriteRule . /index.php [L]

所有非“.php”的请求都被转发到主页...所以 mod_rewrite 肯定是启用的,它只是不能正常工作。有谁知道可能是什么问题?

编辑:这不是重复的 - 其他解决方案都不适合我。我的问题是不存在解决方案,它为什么不为我工作。没有人能够解决这个问题,我自己也尝试了很多解决方案。这个论坛的目的不就是解决具体问题吗?

请允许我澄清...

我在子文件夹中运行了 MyBB,它的重写工作正常。例如,此链接有效:http: //iioengine.com/forums/Forum-Box2D

所有不属于 MyBB 的 php 页面在其 URL 中仍然具有 .php 扩展名 - 我正在尝试删除这些但没有任何效果。示例:http: //iioengine.com/demos

... [原帖]

显然有很多关于此的信息,但我尝试了近十几种不同的解决方案,但都没有超过 404 页面。

这是我的网站: http: //iioengine.com/,所有页面都是 php,除了主页和所有论坛页面之外的所有页面在其 URL 的末尾都有一个“.php”,我想删除它。

除了将非“.php”请求重定向到正确的页面之外,我还想删除“.php”部分,即使它是请求的一部分(因为我的所有内容都已经在其超链接)。

这是我到目前为止所拥有的,主要来自这篇文章,但它不起作用,我得到一个 404 页面。

RewriteEngine on
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ $1.php [L,QSA]
RewriteCond %{REQUEST_URI} ^/(.*).php$
RewriteRule ^(.*)$ %1 [L,QSA]

在所有情况下,我需要在我的 htaccess 文件中从 URL 中删除文件扩展名吗?谢谢

4

5 回答 5

38

试试这个隐藏 .php 的代码(两种方式都可以):

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

## don't touch /forum URIs
RewriteRule ^forums/ - [L,NC]

## hide .php extension snippet

# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L]

# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L]
于 2013-04-11T04:30:33.200 回答
3

尝试这个。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ $1.php [L,QSA]
</IfModule>

如果这不起作用,那么您的服务器没有激活 mod_rewrite 或支持 url 重写。

于 2013-04-10T05:01:04.887 回答
0

这应该工作

Options -Indexes +FollowSymlinks -MultiViews

RewriteEngine on

DirectoryIndex index.php

# REDIRECT Force requests for named index files to drop the index file filename, and force non-www to avoid redirect loop
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]*/)*index\.(html?|php[45]?)(\?[^\ ]*)?\ HTTP/
RewriteRule ^(([^/]*/)*)index\.(html?|php[45]?)$ http://example.com/$1 [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+)/([^\.]+)\.php\ HTTP/
RewriteRule ^([a-zA-Z0-9_-]+)/([^.]+)\.php$ http://example.com/$1/$2 [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+)/([^/]+)/([^\.]+)\.php\ HTTP/
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([^.]+)\.php$ http://example.com/$1/$2/$3 [R=301,L]

# REDIRECT www to non-wwww
RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
RewriteRule .? http://example.com%{REQUEST_URI} [R=301,L]

# REWRITE url to filepath
RewriteRule ^([a-zA-Z0-9_-]+)/([^/.]+)$ /$1/$2.php [L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([^/.]+)$ /$1/$2/$3.php [L]
于 2013-04-10T05:40:07.237 回答
0

这是我发现的最简单的语法,结果如下:

RewriteEngine on
RewriteRule ^/?PrivacyPolicy$ legal.php?mode=privacy [NC,L]
RewriteRule ^Report/([0-9]+)$ report.php?id=$1 [NC,L] 

结果:

  1. PrivacyPolicy 到 legal.php?mode=privacy
  2. 报告/55 到 report.php?id=55
于 2013-04-10T05:47:34.583 回答
0

在 apache 2.4 及更高版本上,您可以使用以下带有END标志的规则从 url 中删除 .php 扩展名。

RewriteEngine on

RewriteRule ^(.+)\.php$ /$1 [NC,L,R=301]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)/?$ /$1.php [END]
于 2016-05-18T04:10:54.830 回答