如何解决Mod-Rewrites在PHP的htaccess中不起作用
我已经从其他站点复制了htaccess文件(它们都可以正常工作,并且都在同一服务器上),并且仅更改了需要更改的URL(即,从非www重定向到www时),但实际上并没有工作。
例如,我将/index.PHP
更改为/index
失败,但是/example.html
在/example
上确实起作用,这使我认为这是PHP或htaccess行为的问题用PHP?
我已经问了我的几个朋友看看它,他们不知道为什么会发生。
我的.htaccess文件是:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.PHP -f
RewriteRule ^(.*)$ $1.PHP [NC,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html [NC,L]
我的VirtualHost是:
<VirtualHost *:443>
ServerName example.com
ServerAlias localhost
DocumentRoot "/var/www/example.com/public_html"
<Directory "/var/www/example.com/public_html">
Options +Includes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
ServerAlias localhost
DocumentRoot "/var/www/example.com/public_html"
<Directory "/var/www/example.com/public_html">
Options +Includes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
RewriteEngine on
RewriteCond %{SERVER_NAME} =example.com [OR]
RewriteCond %{SERVER_NAME} =localhost
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
ServerAlias localhost
DocumentRoot "/var/www/example.com/public_html"
<Directory "/var/www/example.com/public_html">
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
SSLCertificateFile /etc/letsencrypt/live/www.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
ServerAlias localhost
DocumentRoot "/var/www/example.com/public_html"
<Directory "/var/www/example.com/public_html">
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
RewriteEngine on
RewriteCond %{SERVER_NAME} =www.example.com [OR]
RewriteCond %{SERVER_NAME} =localhost
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,R=permanent]
</VirtualHost>
(我已经用example.com替换了该域,它们与htaccess或vhost中的域名不同。)
.htaccess当然没有被禁用,如果我进行重定向,它就可以正常工作,例如:
Redirect 301 /test https://example.com/test
和...
root@server:~# a2enmod rewrite
Module rewrite already enabled
我以前从未在Web服务器上遇到过任何类似的问题,而对于为什么发生此问题我感到非常困惑。
解决方法
您实际上没有说明正在发生的事情(错误,响应代码等),但是,关于无扩展名的URL,您的配置存在一些问题。
Options +Indexes +Includes +FollowSymLinks +MultiViews
您正在服务器配置中显式启用MultiViews
,但是,这将与试图附加文件扩展名的.htaccess
中的mod_rewrite指令冲突。 MultiViews
需要禁用。例如。 -MultiViews
(不是+
)。
但是,由于某种原因,您还启用目录索引(Indexes
)和服务器端包含(Includes
)吗?这是故意的吗?而且,令人困惑的是,您为www子域设置的选项与为域顶点设置的选项不同吗?
在vHost容器中,通常最好仅声明所需的选项。例如:
Options FollowSymLinks
(通过不设置它自然禁用MultiViews。)
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [NC,L]
.htaccess
中的这些用于附加文件扩展名的mod_rewrite指令并非严格正确。尽管它们可能适用于您的“有效” URL,但是恶意用户可能会以/index/<anything>
的形式构造URL,否则将映射到/index.php
,从而触发重写循环(500 Internal Server Error) * 1 。
这些应改为这样(假设您的.htaccess
文件位于文档根目录中)以避免此漏洞:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule (.*) $1.html [L]
文字点不需要在 TestString (RewriteCond
指令的第一个参数)中转义,因为这是一个“字符串”,而不是正则表达式。这里不需要NC
标志。
如果您的URL本身不包含“文件扩展名”,则可以通过不测试已经具有文件扩展名的URL来优化上述内容。例如:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
RewriteRule !\.\w{2,4}$ %{REQUEST_URI}.php [L]
取反的正则表达式!\.\w{2,4}$
仅与不包含文件扩展名的URL匹配。在这种情况下,文件扩展名是URL路径末尾2到4个字母/数字的序列,后跟一个点。
* 1 请参阅my answer,以解决下面的ServerFault问题,该问题更详细地介绍了潜在的重写循环以及导致的500错误响应:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。