htaccess 从 url 中删除 index.php

Posted

技术标签:

【中文标题】htaccess 从 url 中删除 index.php【英文标题】:htaccess remove index.php from url 【发布时间】:2011-05-20 21:22:46 【问题描述】:

我有一个问题,谷歌索引了一些带有错误 url 的页面。

他们正在索引的网址是:

http://www.example.com/index.php/section1/section2

我需要它重定向到:

http://www.example.com/section1/section2

.htaccess 不是我的强项,因此非常感谢任何帮助。

提前致谢。

【问题讨论】:

【参考方案1】:

试试这个,它对我有用

<IfModule mod_rewrite.c>

# Enable Rewrite Engine
# ------------------------------
RewriteEngine On
RewriteBase /

# Redirect index.php Requests
# ------------------------------
RewriteCond %THE_REQUEST ^GET.*index\.php [NC]
RewriteCond %THE_REQUEST !/system/.*
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,L]

# Standard ExpressionEngine Rewrite
# ------------------------------
RewriteCond $1 !\.(css|js|gif|jpe?g|png) [NC]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

</IfModule>

【讨论】:

【参考方案2】:

原来的答案实际上是正确的,但缺乏解释。我想补充一些解释和修改。

我建议阅读这篇简短的介绍https://httpd.apache.org/docs/2.4/rewrite/intro.html(15 分钟)并在阅读时参考这两页。

https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html https://httpd.apache.org/docs/2.4/rewrite/flags.html


这是从 URL 中隐藏 index.php 的基本规则。把它放在你的根 .htaccess 文件中。

mod_rewrite 必须使用 PHP 启用,这将适用于高于 5.2.6 的 PHP 版本。

RewriteEngine On
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule (.*) /index.php/$1 [L]

%REQUEST_FILENAME 视为主机之后的路径。

例如https://www.example.com/index.html, %REQUEST_FILENAME/index.html

所以最后 3 行的意思是,如果它不是常规文件 !-f 而不是目录 !-d,则执行 RewriteRule

关于 RewriteRule 格式:

所以RewriteRule (.*) /index.php/$1 [L] 表示,如果满足 2 个RewriteCond,它(.*) 将匹配主机名之后的所有内容。 . 匹配任何单个字符,.* 匹配任何字符(.*) 使这个变量可以用$1 引用,然后替换为/index.php/$1。最终效果是在整个 URL 路径中添加前面的index.php

例如对于https://www.example.com/hello,它将产生https://www.example.com/index.php/hello 内部

另一个关键问题是,这确实解决了问题。 内部,(我猜)它总是需要https://www.example.com/index.php/hello,但是通过重写,您可以在没有index.php 的情况下访问该站点,apache 在内部为您添加了这一点。


顺便说一句,Apache 文档不太推荐制作一个额外的 .htaccess 文件。

重写通常在主服务器配置中配置 设置(在任何&lt;Directory&gt; 部分之外)或在&lt;VirtualHost&gt; 内部 容器。这是最简单的重写方法,推荐

【讨论】:

如果您真的在为 SEO 工作,则无需将连字符转换为下划线。人们正在为 SEO 做反向操作。连字符对 Google 友好。 这不会删除 index.php,而是添加它! 这两个建议完全一样? 请解释一下你是做什么的。 99% 的人不明白你在 3 行中做了什么。 问题变了吗?此解决方案是将 index.php 添加到没有(或确实)有它的 URL。【参考方案3】:

我不需要太多笨重的代码来给出一点点 sn-p 为我解决了这个问题。

我有 https://example.com/entitlements/index.php 而我希望任何输入它的人在您输入 https://example.com/entitlements/index 您仍然会收到错误,因为包含“index”这个词,尽管 index.php 的内容仍会正确显示,但总会抛出错误 p>

cletus 在“https://***.com/a/1055655/12192635”上发帖 解决了

使用以下内容编辑您的 .htaccess 文件 将访问 https://example.com/entitlements/index.php 的人重定向到 404 页面

RewriteCond %THE_REQUEST \.php[\ /?].*HTTP/
RewriteRule ^.*$ - [R=404,L]

将访问 https://example.com/entitlements/index 的人重定向到 404 页面

RewriteCond %THE_REQUEST \index[\ /?].*HTTP/
RewriteRule ^.*$ - [R=404,L]

尽管我们已经知道上面的代码可以与堆栈上已经存在的代码一起使用,但请查看我将上面的代码应用到了所有代码下方的位置。

# The following will allow you to use URLs such as the following:
#
#   example.com/anything
#   example.com/anything/
#
# Which will actually serve files such as the following:
#
#   example.com/anything.html
#   example.com/anything.php
#
# But *only if they exist*, otherwise it will report the usual 404 error.

Options +FollowSymLinks
RewriteEngine On

# Remove trailing slashes.
# e.g. example.com/foo/ will redirect to example.com/foo
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.+)/$ /$1 [R=permanent,QSA]

# Redirect to HTML if it exists.
# e.g. example.com/foo will display the contents of example.com/foo.html
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME.html -f
RewriteRule ^(.+)$ $1.html [L,QSA]

# Redirect to PHP if it exists.
# e.g. example.com/foo will display the contents of example.com/foo.php
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME.php -f
RewriteRule ^(.+)$ $1.php [L,QSA]

RewriteCond %THE_REQUEST \.php[\ /?].*HTTP/
RewriteRule ^.*$ - [R=404,L]

RewriteCond %THE_REQUEST \index[\ /?].*HTTP/
RewriteRule ^.*$ - [R=404,L]

【讨论】:

【参考方案4】:

For more detail

在项目根目录创建 .htaccess 文件,并在下面添加删除 index.php 的代码

  RewriteEngine on
  RewriteCond $1 !^(index.php|resources|robots.txt)
  RewriteCond %REQUEST_FILENAME !-f
  RewriteCond %REQUEST_FILENAME !-d
  RewriteRule ^(.*)$ index.php/$1 [L,QSA]

【讨论】:

【参考方案5】:

从您的 wordpress 网站的 url 中删除 index.php 的步骤。

    检查您是否应该在您的服务器上启用 mod_rewrite。 要检查它是否已启用 - 使用以下命令在您的根文件夹中创建 1 个文件 phpinfo.php。
 <?php
   phpinfo?();
 ?>

现在运行这个文件 - www.yoursite.com/phpinfo.php,它会在加载模块部分显示 mod_rewrite。 如果未启用,则在终端执行以下命令。

sudo a2enmod rewrite
sudo service apache2 restart
    确保您的 .htaccess 存在于您的 WordPress 根文件夹中,如果没有,请创建一个 .htaccess 文件 将此代码粘贴到您的 .htaccess 文件中:-
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.php$ - [L]
  RewriteCond %REQUEST_FILENAME !-f
  RewriteCond %REQUEST_FILENAME !-d
  RewriteRule . /index.php [L]
</IfModule>  

    进一步将 .htaccess 权限设置为 666,使其可写,现在您可以在 wordpress 永久链接中进行更改。

    现在转到设置 -> 永久链接 -> 并更改为您需要的 url 格式。 删除此代码 /index.php/%year%/%monthnum%/%day%/%postname%/ 并在自定义结构中插入此代码:/%postname%/

    如果还是不成功那就检查你的主机,我的是digitalocean服务器,所以我自己清除了

编辑文件 /etc/apache2/sites-enabled/000-default.conf

在 DocumentRoot /var/www/html 之后添加了这一行

<Directory /var/www/html>
   AllowOverride All
</Directory>

重启你的apache服务器

注意:/var/www/html 将是您的文档根目录

【讨论】:

将“AllowOverride All”添加到您所说的将导致 apache2 重新启动错误的行。不工作【参考方案6】:

我已使用上述部分中的许多代码从基本 url 中删除 index.php。但它并没有从我的角度工作。所以,你可以使用我用过的这段代码并且它工作正常。

如果您确实需要从基本 URL 中删除 index.php,那么只需将此代码放入您的 htaccess 中。

RewriteCond %THE_REQUEST ^GET.*index\.php [NC]

RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

【讨论】:

【参考方案7】:

这将起作用,在 .htaccess 文件中使用以下代码 重写引擎开启

# Send would-be 404 requests to Craft
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_URI !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
RewriteRule (.+) index.php?p=$1 [QSA,L]

【讨论】:

【参考方案8】:

从 URL 中删除 index.php,并将访问者重定向到页面的非 index.php 版本:

RewriteCond %THE_REQUEST ^GET.*index\.php [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

这会将/index.php/myblog 完全重定向到/myblog

使用 301 重定向将保留 Google 搜索引擎排名。

【讨论】:

【参考方案9】:

有些人可能会通过上面列出的方法使用 mod_rewrite 得到 403。将 index.php 重写出来的另一种解决方案如下:

<IfModule mod_rewrite.c> 

RewriteEngine On

# Put your installation directory here:
RewriteBase /

# Do not enable rewriting for files or directories that exist
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

</IfModule> 

【讨论】:

【参考方案10】:

假设存在的 url 是

http://example.com/index.php/foo/bar

我们想把它转换成

 http://example.com/foo/bar

您可以使用以下规则:

RewriteEngine on
#1) redirect the client from "/index.php/foo/bar" to "/foo/bar"
RewriteCond %THE_REQUEST /index\.php/(.+)\sHTTP [NC]
RewriteRule ^ /%1 [NE,L,R]
#2)internally map "/foo/bar" to "/index.php/foo/bar"
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^(.+)$ /index.php/$1 [L]

在 spep #1 中,我们首先匹配请求字符串并捕获 /index.php/ 之后的所有内容,并将捕获的值保存在 %1 变量中。然后我们将浏览器发送到一个新的 url。 #2 在内部处理请求。当浏览器到达 /foo/bar 时,#2rule 会将新的 url 重写到原来的位置。

【讨论】:

嗨,伙计,你能给我看灯吗?我的 ***.com/questions/69812175/… 有问题【参考方案11】:

执行以下步骤

1. 确保主机/您的 pc mod_rewrite 模块处于活动状态。如果未激活,则尝试以某种方式激活,打开 httpd.conf 文件。您可以在 phpinfo.php 中检查以找出答案。

更改此设置:

#LoadModule rewrite_module modules/mod_rewrite.so

成为并重新启动 wamp

LoadModule rewrite_module modules/mod_rewrite.so

2.然后进入.htaccess文件,尝试修改为:

RewriteEngine On

RewriteBase /

RewriteCond %REQUEST_FILENAME !-f

RewriteCond %REQUEST_FILENAME !-d

RewriteRule ^(.*)\?*$ index.php/$1 [L,QSA]

如果上述方法不起作用,请尝试以下操作:

RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d

# otherwise forward it to index.php
RewriteRule . index.php

3. 将.htaccess文件移动到根目录,index.php在哪里。

www OR root folder
- index.php
- .htaccess

【讨论】:

如果你能指导我,我将不胜感激,我可以添加两个重写条件是一个.htaccess 文件。我的 htaccess 文件工作正常,但我需要在同一个文件中重写。我想把这个网址(http://www.example.ae/index.php?route=common/thispage)改写成(http://www.example.ae/thispage)【参考方案12】:
RewriteEngine On
RewriteCond %THE_REQUEST ^[A-Z]3,9\ /(.*)index\.php($|\ |\?)
RewriteRule ^ /%1 [R=301,L]

【讨论】:

我必须添加 RewriteRule ^administrator - [L,NC] 以忽略管理目录 我使用这个规则很长一段时间,直到我发现它与需要输出index.php 到URL 的其他脚本如Codiad、Afterlogic Webmail Lite 或phpSysInfo 冲突。如果我在第一个 RewriteCond 之前添加异常,它仍然有效,如下所示:RewriteCond %REQUEST_URI !^/mysubfolder

以上是关于htaccess 从 url 中删除 index.php的主要内容,如果未能解决你的问题,请参考以下文章

代码点火器 | .htaccess 从 url 中删除 index.php

使用htaccess从url中删除“index.php?access =”

htaccess 帮助,从 URL 中删除一个字符串

强制从 codeigniter 中删除 index.php

使用htaccess从URL中删除公用文件夹

.htaccess 删除 index.php 并从 URL 中隐藏参数键