【问题标题】:Removing URL .php extension gives 404 error删除 URL .php 扩展名会出现 404 错误
【发布时间】:2014-03-24 18:29:15
【问题描述】:

我正在重写我的网址以摆脱 .php 扩展名(希望 get 变量也是如此,因为我得到的所有帮助都很棒,但仍然无法正常工作。

这是我的代码:

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

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

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

现在,当我使用此代码时,它会将 .php 取出,但随后错误提示:

Not Found

The requested URL /index.php was not found on this server.

同时,如果我取出该代码,它可以正常工作,但具有 .php 扩展名

【问题讨论】:

  • 好吧,你隐藏 .php 并在之后请求它。没有扩展就找不到它。我建议在之后隐藏扩展。
  • @KRUKUSA 如果我这样做,它会将我重定向到我的本地主机核心文件(MAMP 本地主机屏幕)
  • 我对此不太满意,但如果你在其中抛出一个语句,比如 if / contains .php replace with .....
  • 只有你想隐藏扩展名?或者你想要更多的东西?

标签: php html apache .htaccess url


【解决方案1】:

我在 .htaccess 中使用此代码删除 .php 扩展并将 .php 扩展页面重定向到非 .php 扩展页面:

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteRule ^(wp-admin)($|/) - [L] # You don't want to mess with WordPress 
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_FILENAME}\.php -f
 RewriteRule .* $0.php

 # browser requests PHP
 RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.php
 RewriteRule ^/?(.*)\.php$ /$1 [L,R=301]

 # check to see if the request is for a PHP file:
 RewriteCond %{REQUEST_FILENAME}\.php -f
 RewriteRule ^/?(.*)$ /$1.php [L]
</IfModule>

.htaccess中使用上述代码时,您可以在没有扩展名的情况下访问PHP页面以及当用户访问带有.php的页面时strong> 扩展,他/她将被重定向到没有扩展的页面。

例子:

http://example.com/page.php 被重定向到http://example.com/page

http://example.com/page 将与 http://example.com/page.php

内部访问带有扩展名的PHP文件不会有任何问题:

<?
include("page.php");
?>

可以正常工作。

【讨论】:

  • 这行得通!但我遇到了一个问题,它将我重定向到localhost/mypage,它需要是localhost/myproject/mypage
  • 我怎样才能取出 GET 变量?
  • @user3241507 嗯 .. 它对我来说效果很好。可能 .htaccess 中有另一个代码与我的代码冲突。我不知道通过重定向传递 GET 参数的任何方法。您应该将带有 GET 参数的 .php URL 更改为带有 GET 参数的非 .php URL
  • 但是如何让它访问子文件夹而不是主站点?
  • @user3241507 我更新了答案代码。现在就试试。它可能工作
【解决方案2】:

将此代码放在/myproject/.htaccess(不在根目录中):

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

## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} /([^.]+)\.php[\s?] [NC]
RewriteRule ^ %1 [R=301,L]

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

然后在新的浏览器中进行测试。

【讨论】:

    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 2020-08-11
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多