2

首先,我知道周围有很多类似的问题,但是

  1. 他们似乎都不适合我
  2. 他们都没有真正解决我想要的

正如标题所示,我想要的是将没有.php扩展名的 URL 重定向到实际.php文件 - 如果可能的话更改 URL(我认为这只是由 [R=301] 处理的)。我尝试的最新方法是:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ $1.php [R=301]

那是行不通的。我仍然无法访问/about.php/about(虽然.htaccess 规则本身工作正常)

我理解 RegEx 很好,但 htaccess 规则只是让我头疼=[

所以我该怎么做?


现在我知道你在想什么

你们中的一个人会这样说:“你为什么要这样做?只需完全摆脱扩展程序并通过/about/about/使用尾部斜杠访问您的页面。”

我想这样做,它看起来很不错。问题是搜索引擎优化——我认为我的页面排名会被消灭,因为突然之间它们在不同的 URL 上。所以在你建议之前,建议我如何保持我的页面排名第一。

我实际上在做的实际上是缩短海报的 URL——人们记住它mywebsite.com/aboutmywebsite.com/about.php.

4

3 回答 3

1

通过启用 mod_rewrite 和 .htaccess httpd.conf,然后将此代码放在您.htaccessDOCUMENT_ROOT目录下:

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 [NC]
RewriteRule ^ %1 [R=302,L]

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

请确保您使用以下方法禁用了 MultiViews 选项:Options -MultiViews

确认它工作正常后,替换R=302R=301. R=301在测试你的 mod_rewrite 规则时避免使用(永久重定向)。

于 2013-05-08T17:15:33.340 回答
0

这对我行得通。

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

如果你愿意,你可以链接它,例如

RewriteEngine On

# Remove trailing slashes.
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=permanent,QSA]

# Redirect to HTML
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L,QSA]

# Redirect to PHP
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L,QSA]

# Redirect to ASP
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.asp -f
RewriteRule ^(.+)$ $1.asp [L,QSA]
于 2013-05-09T16:50:25.307 回答
0

请确保您的Apache HTTP 服务器上有mod_rewrite并尝试以下操作:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)$ /$1.php [R]

但在检查重定向动态 URL 之前,请先清除缓存或使用其他浏览器,因为您之前已使用过该[R=301]标志!了解更多信息。关于这一点,请访问:https ://stackoverflow.com/a/15999177/2007055


你可以试试这个,但它和前面的代码完全一样:

RewriteEngine on

RewriteRule ^([a-zA-Z0-9_-]+)$ http://%{HTTP_HOST}/$1.php

当它起作用时,尝试在重写规则上方添加这两个条件:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)$ http://%{HTTP_HOST}/$1.php

当上述任何代码不起作用时,我认为您的Apache HTTP Server存在问题。

于 2013-05-04T15:04:10.100 回答