【问题标题】:Trying to remove .php file extension [duplicate]试图删除 .php 文件扩展名 [重复]
【发布时间】:2014-09-19 15:55:41
【问题描述】:

我刚刚在我的 ubuntu apache 服务器上安装了 mod_rewrite 并启用了 .htaccess。 但是当我编辑 .htaccess 以从文件中删除 .php 文件扩展名时,url 不会改变。

现在我的 .htaccess 文件如下所示:

Options -Indexes

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

不多,只是确保人们无法查看我的文件树并添加了一些自定义错误页面。

但是如果我在我的网站上输入一个页面,例如 href="page.php" 一切正常,但如果我从 url 栏中删除“.php”并将页面重新加载为“www.mysite.com/page”没有 .php 它仍然有效。而且我还没有在 .htaccess 文件中做任何事情,对吗?

如果我现在将以下行添加到 .htaccess:

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

然后访问 href="page.php" 网址仍然显示为 "www.mysite.com/page.php" 而不是 " www.mysite.com/page"

我还需要将 href 从 href="page.php" 更改为 href="page" 吗?为了使 .php 扩展名消失。 - 因为即使我一开始不编辑 .htaccess 文件,它也可以工作。

当我编辑 .htaccess 文件时,我总是确保重新启动 apache。

提前致谢,K

【问题讨论】:

标签: php apache .htaccess mod-rewrite ubuntu


【解决方案1】:

你在这里问了很多问题。让我回答第一个:

www.mysite.com/page 由于Options MultiViews 而无需任何重写规则即可工作。选项MultiViewsApache's content negotiation module 使用,该选项在mod_rewrite 之前运行,并使Apache 服务器匹配文件的扩展名。所以/file 可以在 URL 中,但它会服务于/file.php

如果您将此行放在根 .htaccess 的顶部:

Options -MultiViews

那么www.mysite.com/page会发出404。

还要从您的 URL 中自动删除 .php,在您的根 .htaccess 中使用此代码:

Options -MultiViews
RewriteEngine On

# To externally redirect /dir/file.php to /dir/file
RewriteCond %{THE_REQUEST} \s/+(?:index)?(.*?)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=301,L,NE]

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

【讨论】:

  • 它可以工作,但链接被破坏,我的网址变成“www.mysite.com:8080/page” 不知道为什么会出现“:8080”,可能是因为我安装了清漆?
  • 是的,至少这些规则都没有在任何地方添加:8080
  • 好的,所以如果我的 href 看起来像 href="page.php" 我将被重定向到 "www.mysite.com:8080/page" 并且这不起作用.. 但如果我的 href 是href="page" 我被重定向到“www.mysite.com/page”并且它有效。只要我将 .php 添加到 url 并重新加载页面,它就会将我重定向到 :8080
  • 尝试像这样替换您的链接:href="/page.php"
  • 感谢您的回答,但对我没有帮助。一旦 .php 出现在链接中,它就会被破坏。我认为这与apache/varnish有关。 Prob Apache 在公共接口上侦听而不是在环回接口上。
【解决方案2】:
  1. 如果page 自动呈现page.php,则您已启用Content Negotiation,很可能是在httpd.conf 级别启用MultiViews
  2. 是的,您必须链接到您希望在地址栏中显示的内容。

【讨论】:

    【解决方案3】:

    试试这个。

    RewriteRule (.*)\ $1.php
    

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 2017-04-22
      • 1970-01-01
      相关资源
      最近更新 更多