首先,我知道有很多类似的问题,但是
正如标题所示,我想要的是将没有.php
扩展名的网址重定向到实际的.php
文件 - 如果可能的话更改网址(我认为这只是由[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/
使用尾部斜杠访问您的网页。”
我想这样做,看起来很不错。问题是搜索引擎优化 - 我假设我的网页排名将被湮灭,因为他们突然在不同的网址上。所以在你建议之前,建议我如何保持我的页面排名第一。
我实际上在做的事实上是海报的网址缩短 - 人们记住mywebsite.com/about
比mywebsite.com/about.php
更容易。
答案 0 :(得分:1)
通过httpd.conf
启用mod_rewrite和.htaccess,然后将此代码放在.htaccess
目录下的DOCUMENT_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=302
替换为R=301
。在测试mod_rewrite规则时,请避免使用R=301
(永久重定向)。
答案 1 :(得分:0)
请确保 Apache HTTP Server 上有 mod_rewrite 并尝试此操作:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)$ /$1.php [R]
但在检查重定向动态网址之前,请先清除缓存或使用其他浏览器,因为您之前使用的是[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 存在问题。
答案 2 :(得分: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]